javascript - hur kan jag avgöra när Google Maps loadGeoJson är klart?
Jag har ett scenario där användare kan spara sin kartstil. När en användare navigerar tillbaka till den sidan med kartan bör den visa kartan på samma sätt som tidigare.
Användaren kan ändra färger på geografiska områden och gränser samt tillämpa tematiska stilar baserade på demografisk information.
Med lanseringen av den nya loadGeoJson har jag haft stor framgång med att snabba upp min applikation. Inledningsvis ritade jag alla geografier själv via JS. Detta orsakade vissa minnesproblem vid cirka 1500 geografier. Denna nya funktionalitet minskar det avsevärt. Jag väljer att generera Features-objekten på serversidan och bara skicka en URL till kartan för rendering. Denna URL skickas tillsammans med all annan stilinformation för att återskapa kartan som den var tidigare.
Problemet jag stöter på är att när jag försöker applicera stilarna har kartan inte hämtat sin lista över funktioner som ska visas på kartan.
Genom att gå igenom dokumentationen ser jag inga händelser specifikt för metoden loadGeoJson, men såg för addfeature och setgeometry, men ingen av dessa händelser utlöses när man använder metoden loadGeoJson.
Detta har allt skrivits i Typescript och försöker följa en ganska strikt MVVM-ansats med hjälp av Knockout för att hantera alla UI-ändringar åt mig via bindning.
Finns det en annan händelse jag kan knyta an till för att se när den här metoden har slutförts så att jag kan tillämpa mina stilar på lämpligt sätt?
Finns det ett annat tillvägagångssätt där jag kan införa en 'vänta' någonstans?
Svar #1
addfeature-händelsen anropas definitivt av loadGeoJson, om den inte gör det för dig är det något fel i inställningen.
loadGeoJson har en valfri callback-parameter som anropas efter att alla funktioner har laddats och har funktionerna som parameter.
https://developers.google.com/maps/documentation/javascript/3.exp/reference
loadGeoJson(url:string, options?:Data.GeoJsonOptions, callback?:function(Array))
Du kan signalera din kod från denna återuppringning att den kan fortsätta bearbeta.
map.data.loadGeoJson('google.json', null, function (features) {
map.fitBounds(bounds); // or do other stuff what requires all features loaded
});
Du kan också slå in loadGeoJson i ett löfte och lösa löftet i loadGeoJson:s återanropsfunktion.
function loadGeoJson(url, options) {
var promise = new Promise(function (resolve, reject) {
try {
map.data.loadGeoJson(url, options, function (features) {
resolve(features);
});
} catch (e) {
reject(e);
}
});
return promise;
}
// Somewhere else in your code:
var promise = loadGeoJson('studs.json');
promise.then(function (features) {
// Do stuff
});
promise.catch(function (error) {
// Handle error
});
Svar #2
Du kan lyssna på addFeature-händelsen som kommer att utlösas för varje funktion i din json. t.ex. om du använder https://storage.googleapis.com/maps-devrel/google.json utlöses sex händelser efter att json-förfrågan har slutförts, dvs. när Google API börjar lägga till funktionerna från json-filen:
Du kan se demon här: http://jsbin.com/ofutUbA/4/edit
