我有一个主视图和两个 subview (使用 DurandalJS 组合)。现在,主视图的 viewAttached 事件提前触发,而我的 subview 仍在处理 ajax 请求。理想情况下,主视图只会将 View 附加到 DOM 并在所有组成的 subview 完成激活后运行转换。
<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>
最佳答案
处理此问题最直接的方法是在主视图激活期间手动激活 subview 。
从 subview 组合绑定(bind)中删除 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 返回一个 promise ,该 promise 仅在子 VM 完成激活时才解析。同样,子 VM 应确保其激活函数返回一个 promise ,该 promise 仅在该子 VM 的 AJAX 请求完成时才解析。
有一个 thread in Durandal Groups讨论了一个类似的概念。如果您还没有,那么绝对值得阅读一下文档,特别是与您的问题相关的文档:
关于javascript - 仅在 DurandalJS 中激活所有组合模块后才附加 View 。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15835709/