在Durandal 2.x应用程序中,我有一个视图,每次用户导航时都需要获取新数据。该视图通过子路由器提供:
define(['plugins/router'], function(router) {
var vm = {};
vm.router = router.createChildRouter()
.makeRelative({
moduleId: 'viewmodels/cms',
fromParent: true
}).map([
{ route: ['inventory', ''], moduleId: 'inventory/overview', title: 'Inventory Management', nav: true }
]).buildNavigationModel();
return vm;
});
我已将数据获取逻辑放在activate
overview.js
方法上
define(function(){
var vm = {};
vm.activate = function(){
// fetch data here
};
return vm;
});
但是,activate
仅在我第一次导航到该视图时调用,而对于主路由器上的视图,每次调用activate
。
我尝试在子路由器上设置cacheViews: false
,但这并未改变任何内容。
我也意识到每次调用我的viewmodel上的binding
方法都是这样的:
activate
?binding
方法上是否存在固有的错误? 答案 0 :(得分:1)
你应该使用附加的钩子。 每次将视图附加到dom时都会调用此方法。
看看关于Hooking Lifecycle的Durandal Docs,这应该让您了解可用的钩子以及它们正在做什么。
编辑: 对不起,也许“应该”有点过早,这取决于你的用例。绑定和附加都应该完成它完成时所依赖的工作。绑定将在应用DOM之前挂钩并在之后附加。因此,取决于您是否希望用户在加载所有内容之前看到白页,或者您是否想要显示某些内容然后将数据驱动部分填充为附加解析的Promise。所以它真的是一个UI决定。
至于第3个问题,加载数据实际上并不是激活逻辑,因为在构建UI之后可能会重新获取数据。因此,它更像是数据层的一个方面 - >业务逻辑,但这是一个非常哲学的问题:)。绑定完全与在Knockout绑定开始之前提取数据有关,因此我认为如果您需要扼杀用户体验,将该逻辑绑定或分别附加没有问题。