3

在我shell.js的 中,可以调用一个操作来从 API 端点(票证列表)收集一些数据。一旦我有了这些数据,我router.navigateTo("purchase"),就是一条有效的路线。

我现在需要将此数据传递到 viewModel 中。有没有使用 DurandalJS 执行此操作的标准方法,或者我是否必须研究某种发布/订阅机制?

一种解决方案(我现在已经实现)是只使用 window -in shell.js,一旦数据服务调用完成,我说window.tickets = dataFromService. 然后在“购买”虚拟机中,我从window.tickets. 这感觉很脏,我对 durandal 的正确解决方案很感兴趣。

4

2 回答 2

3

在 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 中的数据传递到其他视图

于 2013-06-10T07:13:35.923 回答
2

您还可以使用自定义事件(发布/订阅样式)在视图模型之间传递任意数据。

app.trigger('my:custom:event', message);

app.on('my:custom:event').then(function(message){
    //do something with the payload
});

查看文档以获取更多详细信息。

于 2013-09-12T22:06:19.523 回答