2014-04-14 86 views
4

我有一個場景,用戶可以存儲他們的映射樣式。當用戶用地圖導航回到該頁面時,它應該以之前的方式顯示地圖。我如何確定Google Maps loadGeoJson何時完成?

用戶可以更改地理位置和邊界的顏色,也可以根據人口統計信息應用主題樣式。

隨着新的loadGeoJson的發佈,我在加速應用程序方面取得了巨大的成功,最初我通過JS自己繪製了所有的地理區域。這在大約1500個地區造成了一些記憶問題。這個新功能顯着降低了它。我選擇在服務器端生成Features對象,並將URL傳遞給地圖進行渲染。該URL將與其他所有樣式信息一起傳遞,以重新構建之前的地圖。

我遇到的問題是當我嘗試應用這些樣式時,地圖未檢索到要在地圖上顯示的要素列表。

通過文檔查看,我沒有看到任何專門針對loadGeoJson方法的事件,但確實看到了addfeature和setgeometry,但是在使用loadGeoJson方法時不會引發這些事件。

這一切都是用Typescript編寫的,並試圖遵循一個非常嚴格的MVVM方法,使用Knockout通過綁定來處理所有UI更改。

是否有另一個事件可以與此關聯以查看此方法何時完成,以便我可以適當地應用我的樣式?

有沒有另一種方法可以讓我在某處「等待」? 。

+0

你能鏈接文檔嗎? –

回答

1

你可以聽addFeature事件,這將在您的JSON每個功能被解僱。例如如果您使用https://storage.googleapis.com/maps-devrel/google.json,在之後發生了六個事件,則完成json請求即當谷歌API開始從JSON文件中添加的功能:

enter image description here

您可以在這裏看到演示:http://jsbin.com/ofutUbA/4/edit

+0

* ... json請求完成後引發事件... *因此,在第一個'addFeature'事件中,我們可以安全地假設接收到所有json數據?謝謝。 –

+1

@AntoJurković是,如果功能名稱匹配只能來自JSON的內容。我懷疑它的真實性,否則,因爲我們正在訂閱'.data.addListener',它只會引發從'.data'創建的特性的事件,因此'loadGeoJson',但它們混淆了代碼,我無法看到 – basarat

+0

謝謝你做到了。我將偵聽器添加到地圖中,而不是數據。這就是爲什麼它沒有被提出。 – BigDubb

0

如果你正在使用敲除,可能會假設綁定到某些偵聽器,或將偵聽器附加到事件。

通過JavaScript的大多數事件總是有一個回調函數,這是一個很好的方法,所以一旦一個函數完成執行一些很長的查詢,它會立即執行該函數。很明顯,回調將由您定義。

someLongTimeFunction(function (data) { 
    // usually this callback will be fired when the function has finished. 
}); 

如果您熟悉的淘汰賽,那麼你就會知道,一旦數據被檢索和您通過一個observableobservable將更新其綁定。

這裏是鏈接延長觀測:knockout js

至於我能理解你從質疑,這loadGeoJson,是服務器端?如果是這樣,你從客戶端做一個長輪詢和領帶成:

function doRequest() { 
    var request = $.ajax({ 
    dataType: "json", 
    url: 'loadGeoJson', 
    data: data, 
    }); 

    request.done(function(data, result) { 
    if (result !== "success") { 
     setTimeout(doRequest, 10000); 
    } 
    }); 
} 
6

addfeature事件肯定是由loadGeoJson調用,如果不適合你的一些設置錯誤。

loadGeoJson有一個可選的回調參數,在加載所有功能並且具有參數功能後調用。

https://developers.google.com/maps/documentation/javascript/3.exp/reference

loadGeoJson(url:string, options?:Data.GeoJsonOptions, callback?:function(Array))

您可以從信號回調,它可以繼續處理您的代碼。

map.data.loadGeoJson('google.json', null, function (features) { 
    map.fitBounds(bounds); // or do other stuff what requires all features loaded 
}); 

您還可以將loadGeoJson包裝爲承諾並解析loadGeoJson的回調中的承諾。

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 
}); 
+0

嗨,我在這裏使用你的解決方案!很好的工作,有一個關於如何錯誤陷阱的問題,如果JSON無效。我似乎無法捕捉到這個錯誤。我從一個json文件加載,可能會改變,並希望告訴用戶json文件無效... 目前我只得到「未捕獲InvalidValueError:在屬性」功能「:在索引42:屬性」幾何「:在財產」幾何「:在索引1:屬性」座標「:在索引0:第一和最後的位置是不相等的」在Chrome中...似乎無法趕上這...先謝謝你,如果有誰知道?? – Tim

+0

@Tim如果loadGeoJson拋出一個異常,你可以將它嵌入到try-catch塊中。查看更新後的答案。 – user3285954

+0

是的,我已經嘗試過了,試着抓住就像你有它,鉻只是無法抓住它。因此,我的問題的原因。謝謝你的迴應。 .. – Tim