Отображение информационного окна сразу после успешного выполнения запроса Layer
У меня есть веб-приложение, где пользователь может переключаться между слоями размером 160 дюймов. Большинство из них являются слоями объектов, но некоторые имеют тип ArcGISDynamicMapServiceLayer
,
Мне нужно иметь возможность запрашивать эти слои так же, как я это делаю с FeatureLayers: щелкнув любую точку на карте и отобразив информационное окно.
Пока это мой код (для ясности убраны некоторые биты):
executeQueryTask: function(evt, scope) {
//"this" is the map object in this context, so we pass in the scope from the caller,
//which will enable us to call the layer and map object and all the other precious widget properties
scope.map.graphics.clear();
scope.map.infoWindow.hide();
//we create a new Circle and set its center at the mappoint. The radius will be 20 meters
//default unit is meters.
var circle = new Circle({
/*...*/
});
// draw the circle to the map:
var circleGraphic = new Graphic(circle, /*...*/));
scope.map.graphics.add(circleGraphic);
var queryTask = new QueryTask(scope.layer.layer.url + "/" + scope.layer.layer.visibleLayers[0]);
var query = new Query();
query.returnGeometry = true;
query.outFields = ["*"];
query.geometry = circle.getExtent();
var infoTemplate = new InfoTemplate().setTitle("");
queryTask.execute(query, function(resultSet) {
array.forEach(resultSet.features, function(feature) {
var graphic = feature;
graphic.setSymbol(/*...*/));
//Set the infoTemplate.
// graphic.setInfoTemplate(infoTemplate);
//Add graphic to the map graphics layer.
scope.map.infoWindow.setContent(graphic.attributes);
scope.map.infoWindow.show(evt.mapPoint, scope.map.getInfoWindowAnchor(evt.screenPoint));
scope.map.graphics.add(graphic);
});
});
},
Ключевым моментом является настаивать на queryTask.execute
Перезвоните. Если я раскомментирую и использую graphic.setInfoTemplate(infoTemplate);
результат раскрашивается и после второго щелчка появляется информационное окно. Есть 2 проблемы с этим подходом:
- Необходимо 2 клика
- Я не могу дважды щелкнуть Полилинии и Точки, поэтому здесь не появляется информационное окно.
Вот почему я добавил круг, чтобы получить радиус 100 м для моего клика. Теперь я хочу немедленно вернуть информационное окно. На данный момент я изо всех сил пытаюсь создать информационное окно, которое сразу отображается.
В настоящее время линия scope.map.infoWindow.setContent(graphic.attributes);
выдает ошибку Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
Как я могу создать это информационное окно?
1 ответ
Я нашел подходящий подход, который оставляет место для улучшений. Но это для другой итерации.
//create a new FeatureLayer object
var featureLayer = new FeatureLayer(scope.layer.layer.url + "/" + scope.layer.layer.visibleLayers[0], {
mode: FeatureLayer.MODE_SELECTION,
infoTemplate: new InfoTemplate("Attributes", "${*}"),
outFields: ["*"]
});
//we create a new Circle and set its center at the mappoint. The radius will be 20 meters
//default unit is meters.
var circle = new Circle({/*...*/});
// draw the circle to the map:
var circleGraphic = new Graphic(circle, /*...*/));
scope.map.graphics.add(circleGraphic);
var lQuery = new Query();
lQuery.returnGeometry = true;
lQuery.geometry = circle.getExtent();
featureLayer.queryFeatures(lQuery, function(results) {
array.forEach(results.features, function(feature) {
var graphic = feature;
graphic.setSymbol(/*...*/));
//now that we have the feature, we need to select it
var selectionQuery = new Query();
selectionQuery.geometry = feature.geometry;
featureLayer.selectFeatures(selectionQuery, FeatureLayer.SELECTION_NEW)
.then(function(selectedFeatures) {
console.info("selection complete", selectedFeatures);
if (!selectedFeatures.length) {
return;
}
scope.map.infoWindow.setFeatures(selectedFeatures);
scope.map.infoWindow.show(evt.mapPoint, "upperright");
});
});
});
Изменение здесь в том, что мы больше не используем QueryTask
, но создайте новый объект FeatureLayer в режиме выделения, используя url и id видимого слоя.
Второе заслуживающее внимания изменение заключается в том, что мы больше не устанавливаем содержимое окна infoWindow, а вместо этого устанавливаем выбранные функции, используя infoWindow.setFeatures(selectedFeatures)
, Задавая содержимое информационного окна, но не выбирая функции, скрывает список действий информационного окна, это мешает вам масштабировать объект или выполнять другие пользовательские операции. Кроме того, это позволяет вам (или мне) просматривать несколько результатов в информационном окне вместо одного.