Mit dem Kern-Search-Widget kann ich eine Funktion mit searchViewModel.includeDefaultSources verwenden, um nur den standardmäßigen ArcGIS World Geocoding Service durch eine andere Geocoding-Instanz zu ersetzen oder diesen Geocoder aus den Quellen des Search-Widgets zu entfernen.
Zum Beispiel
search.viewModel.includeDefaultSources = function(sourcesResponse) {
searchSources = sourcesResponse.defaultSources;
searchSources.pop();
searchSources.push({
name: "Ort oder Standort",
placeholder: "Ort oder Standort",
apiKey: apiKey,
singleLineFieldName: "SingleLine",
url: "https://geocode-api.arcgis.com/arcgis/rest/services/World/GeocodeServer",
categories: ["Bevölkerter Ort", "Bildung", "Landmerkmale", "Parks und Outdoor", "Wassermerkmale"],
countryCode: "NZL",
filter: searchExtent,
localSearchDisabled: true,
zoomScale: 4513.988705
});
return sourcesResponse.defaultSources;
};
Das war sehr nützlich in meinen Kartenanwendungen, die Webmaps mit konfigurierten Suchlayern verwenden, da ich so die Suchquellen in der Anwendung nicht festlegen muss.
Jetzt, bei Verwendung der arcgis-search Komponente, konnte ich das Gleiche nicht zuverlässig tun. Ich hatte einige Erfolge damit, eine Kopie der defaultSources zu modifizieren und diese zum Setzen der Quellen zu verwenden. Aber es ist etwas unzuverlässig, manchmal funktioniert es beim ersten Laden, manchmal nicht, vielleicht wegen des Timings.
Zum Beispiel
search.componentOnReady().then(() => {
reactiveUtils.when(
() => search.defaultSources.length > 1,
() => {
const searchSources = search.defaultSources.toArray();
searchSources.pop();
searchSources.push(locatorSearch);
search.includeDefaultSourcesDisabled = true;
search.sources = searchSources;
}
);
});
Oder
reactiveUtils.whenOnce(() => search.defaultSources.length > 1).then(() => {
const searchSources = search.defaultSources.toArray();
searchSources.pop();
if (
webmap.applicationProperties.viewing.search.enabled === true &&
webmap.applicationProperties.viewing.search.addressSearchEnabled === true
) {
searchSources.push(locatorSearch);
search.sources = searchSources;
}
else if (
webmap.applicationProperties.viewing.search.enabled === true &&
webmap.applicationProperties.viewing.search.addressSearchEnabled === false
) {
search.sources = searchSources;
}
});
reactiveUtils.whenOnce(() => search.sources.length >= 1).then(() => {
search.includeDefaultSourcesDisabled = true;
console.log(search.sources);
});
Wie kann ich das also zuverlässig mit der arcgis-search Komponente machen?