仅在DurandalJS中激活所有组合模块后附加视图。

时间:2013-04-05 13:51:10

标签: javascript durandal

我有一个带有两个子视图的主视图(使用DurandalJS组合)。现在,主视图的viewAttached事件在我的子视图仍处理ajax请求时提前触发。理想情况下,主视图只会将视图附加到DOM,并在所有组合子视图完成激活后运行转换。

<h1>Hello World</h1>    
<div data-bind="compose: { model: 'viewmodels/subview1', activate: true }">Loading...</div>    
<div data-bind="compose: { model: 'viewmodels/subview2', activate: true }">Loading...</div>

1 个答案:

答案 0 :(得分:3)

处理此问题的最直接方法是在激活主视图期间手动激活子视图。

从子视图compose绑定中删除activate:true,并在主VM中执行以下操作:

//in main view model
var subViewModel1 = require("viewModels/subViewModel1");
var subViewModel2 = require("viewModels/subViewModel2");

function activate() {
    return $.when(
        subViewModel1.activate(),
        subViewModel2.activate()
    ).then(function () {
        //finish your main view's activation here
        ...
    });
}

确保主虚拟机返回的承诺仅在子虚拟机完成激活时解​​析。同样,子VM应确保其activate函数返回仅在完成对该子VM的AJAX请求时解析的promise。

thread in Durandal Groups讨论类似的概念。如果您还没有,那么对于文档也一定值得一读,特别是与您的问题相关的文章: