在 Durandal 的哲学中,shell 不应该检索数据。相反,购买 vm 应该在其activate回调中执行此操作(http://durandaljs.com/documentation/Creating-A-Module/)。activate如果票据收集是一项async操作,请确保返回一个承诺。
这是该模式的一个示例,其中getListCollection可以返回缓存结果(同步)或异步结果,因此包装在 $.when() 中,它总是返回一个promose。
http://www.spirit.de/demos/metro/durandalsp3/index.html#/lists
var activate = function () {
    var self = this;
    var webUrl = L_Menu_BaseUrl;
    self.webUrl(webUrl);
    logger.log('Activatíng List View', null, 'list', true);
    return $.when(spdata.getListCollection({ webUrl: webUrl })).then(function (result) {
        // Access to detail list information through listInfo[listName]
        self.listInfo = result;
        self.lists(createListVMs(result));
        return true;
    });
};
根据评论更新:如果您必须在 shell 中检索数据以做出决策,有几个选项。
- 您可以考虑将购买 vm 转换为小部件,因为在 Durandal 1.2 中,只有小部件可以传入额外的数据。  
- 作为替代方案,创建一个global返回单例并在外壳和购买之间共享的 AMD。
- 第三种选择是将购买声明为 shell 中的依赖项并直接修改购买。
有关详细信息,请参阅@Joseph Gabriel将 DurandalJS 中的数据传递到其他视图。