這是我試圖實現的不尋常的場景: 我得到了gmap
模塊,其中Google地圖是異步加載的。我用下面的代碼來正確安裝谷歌地圖:Durandal如何附加視圖,並不顯示它,直到它準備好了?
composition.addBindingHandler('googleMap', {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
gmap = ko.utils.unwrapObservable(valueAccessor());
var latLng = new gmaps.LatLng(37.774107,-122.420853);
var mapOptions = {
center:latLng,
zoom: 17,
disableDefaultUI: true,
mapTypeId: gmaps.MapTypeId.ROADMAP
};
gmap.googleMap = new gmaps.Map(element, mapOptions);
navigator.geolocation.getCurrentPosition(onSuccess, onError);
}
});
我GMAP模塊是模塊,我想顯示用戶登錄後第一。所以我想在應該顯示這個模塊之前執行一些操作。在大多數情況下,我可以在canActivate
方法中使用Promise,但是!在這種情況下,我的模塊沒有連接。但是我需要附加這個模塊,執行一些操作(獲取數據庫記錄,確定用戶地理位置,根據這些數據在Google Map上添加標記),並且只有在完成後才能將模塊顯示給用戶。 我怎樣才能得到這個作品?我嘗試了Promises,但它對我來說不起作用,因爲我聽attached
方法,在顯示模塊之前它不會觸發。 所以問題:如何激活和附加視圖模型和它的相應的視圖(激活和連接回調應該火),但沒有表現出來,直到條件?
更新: 好吧,這似乎對我的問題不是很明顯可以理解。以下是我的方案:
1.我的SignIn模塊已激活。用戶應該輸入他的憑證。
2.一旦授權返回成功,Gmap模塊應該被激活並附加,但不會顯示。用戶仍然應該看到SignIn模塊和消息,如'Loading data ...'
3.Gmap模塊應該被完全加載(所有的回調應該被觸發)。我需要與DOM進行交互的可能性,這意味着應該連接模塊。但沒有顯示。
4.一旦某些條件成立,SignIn模塊將不可見,並顯示Gmap。
在激活回調中的承諾不適合這種情況,因爲在承諾解決之前視圖不會被附加。基本上,我需要這樣的成功授權之後:
router.navigate('#gmap', { show: false });
......或者......
router.attachModule('#gmap', ...{});
爲什麼我需要與DOM的互動,以及爲什麼無極激活回調不適合我?因爲我需要開始GMAP對象只能與頁面上現有GMAP帆布啓動:
composition.addBindingHandler('googleMap', {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
gmap = ko.utils.unwrapObservable(valueAccessor());
var mapOptions = {
...
};
gmap.googleMap = new gmaps.Map(element, mapOptions);
}
});
和HTML:一旦查看連接
<div id="gmap-section">
<div id="gmap-canvas" data-bind="googleMap:map"></div>
</div>
綁定纔有效。
如何通過挖空可見綁定隱藏它,並在完成所有任務時設置爲true? – zewa666 2014-08-29 13:00:40
當路由器從我的登錄模塊導航到我的gmap模塊時,它隱藏了我的登錄模塊。所以,我看不到gmap模塊,因爲它還沒有準備好(例如,隱藏顯示:無),我看不到我的登錄模塊,因爲它被Durandal的路由器隱藏了。 – BillyZ 2014-08-29 13:27:50