1

我有一个带有两个子视图的主视图(使用 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>
4

1 回答 1

3

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

从子视图组合绑定中删除 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 应确保其激活函数返回一个仅在该子 VM 的 AJAX 请求完成时才解析的承诺。

Durandal Groups中有一个帖子讨论了类似的概念。如果您还没有,那么绝对值得阅读一下文档,特别是与您的问题相关的这些:

于 2013-04-05T15:29:51.547 回答