【发布时间】:2014-09-01 16:20:40
【问题描述】:
这是我试图实现的不寻常场景:
我得到了gmap 异步加载谷歌地图的模块。我正在使用以下代码正确附加 Google 地图:
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,但是!在这种情况下,我的模块没有附加。但是我需要附加这个模块,执行一些操作(获取数据库记录,确定用户地理位置,根据这些数据在谷歌地图上添加标记)并且只有当它完成后才向用户显示模块。
我怎样才能得到这个作品?我尝试了 Promises,但它对我不起作用,因为我听了 attached 方法,该方法在显示模块之前不会触发。
所以问题是:如何激活和附加视图模型及其适当的视图(激活和附加的回调应该触发)但不要显示它直到条件?
更新:
好的,在我看来,我的问题并不是很清楚。这是我的场景:
1. 我的登录模块激活。用户应键入他的凭据。
2.一旦授权返回成功,Gmap模块应该被激活并附加,但不显示。用户仍应看到登录模块和消息,例如“正在加载数据...”
3. Gmap 模块应该完全加载(所有的回调都应该触发)。我需要与 DOM 交互的可能性,这意味着应该附加该模块。但没有显示。
4. 满足某些条件后,SignIn 模块将不可见并显示 Gmap。
激活回调中的承诺不适合这种情况,因为在承诺解决之前不会附加视图。基本上授权成功后我需要这样的东西:
router.navigate('#gmap', { show: false });
...或...router.attachModule('#gmap', ...{});
为什么我需要与 DOM 交互,为什么激活回调中的 Promise 不适合我?因为我需要启动 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?
-
当路由器从我的登录模块导航到我的 gmap 模块时,它会隐藏我的登录模块。所以,我看不到 gmap 模块,因为它还没有准备好(例如,被 display:none 隐藏)而且我看不到我的登录模块,因为它被 Durandal 的路由器隐藏了。
标签: javascript single-page-application durandal durandal-2.0