我有一个带有两个子视图的主视图(使用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>
答案 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讨论类似的概念。如果您还没有,那么对于文档也一定值得一读,特别是与您的问题相关的文章: