single-page-application之Durandal:我在 shell 中有数据——如何将它推送到 View 模型
在我的 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了解详情。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。