javascript - 仅在 DurandalJS 中激活所有组合模块后才附加 View 。

标签 javascript durandal

我有一个主视图和两个 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/

相关文章:

css - durandal.js - 是否可以通过 View 按需加载 View 特定的 css?

javascript - 在 Aurelia 中使用 AMD/Require 模块

javascript - Durandal SPA 与 typescript 有关的问题

javascript - 如何在 Durandal 中禁用缓存 View

javascript - Ext.MessageBox 标题带有很棒的字体图标

javascript - Jquery .css 和动态生成的图像?

php - 带有 LinQ 过滤器和 jQuery tmpl 示例的 jQuery AJAX 请求

asp.net-mvc - Durandal KO 绑定(bind) View 问题

javascript - 在 javascript 中使用 array.map() 内部的异步方法

javascript - 使鼠标悬停在 GeoJson 层上的圆圈上后出现弹出窗口