single-page-application之Durandal:我在 shell 中有数据——如何将它推送到 View 模型

bhlsheji 阅读:38 2024-11-01 17:39:52 评论:0

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

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

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

请您参考如下方法:

在 Durandal 的理念中,shell 不应该检索数据。相反,购买虚拟机应该在其 activate 回调 ( http://durandaljs.com/documentation/Creating-A-Module/ ) 中执行此操作。如果票证收集是 async 操作,请确保从 activate 返回 promise 。

这是该模式的示例,其中 getListCollection 可以返回缓存结果(同步)或异步结果,因此被包装在 $.when() 中,它始终返回一个 promise 。

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 中检索数据以做出决定,则有两种选择。

  • 您可能会考虑像 Durandal 1.2 那样将购买虚拟机转换为小部件 只有小部件可以传递额外的数据。
  • 作为替代方案 创建一个 global AMD,它返回一个单例并在两者之间共享 外壳和购买。
  • 第三种选择是将购买声明为 shell依赖,直接修改purchase。

参见@Joseph Gabriel Pass data in DurandalJS to other view了解详情。


标签:Shell
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号