我有3条路线:items/one,items/two和items/three,它们都指向'items'vm/view。Durandal:Multiple Routes,One ViewModel/View
在items.js激活功能,我检查的网址,并此基础上,我改变了一个过滤器:
function activate(r) {
switch (r.routeInfo.url) {
case 'items/one': vm.filterType(1); break;
case 'items/two': vm.filterType(2); break;
case 'items/three': vm.filterType(3); break;
}
return init(); //returns a promise
}
项目视图与按钮的菜单一,二,和三个。 每个按钮链接到一个这样的动作:
function clickOne() {
router.navigateTo('#/items/one');
}
function clickTwo() {
router.navigateTo('#/items/two');
}
function clickThree() {
router.navigateTo('#/items/three');
}
这一切工作,我得到的观点正确的过滤器。但是,我注意到,如果我在'one',然后转到'two',那么ko-bound变量会'实时'更新,也就是说,当它们在变化时,并且在激活之前承诺解决,这导致转换发生两次(当数据被抓取,并在激活函数返回后)。
这只发生在这种情况下,其中view和viewmodel与前一个相同。我知道这是一种特殊情况,路由器可能正在用areSameItem = true处理新路由的加载。我可以将虚拟机/视图分成三部分,并尝试从基本模型继承,但我希望获得更简单的解决方案。
它调用你的'activate'函数吗? 'filterType()'返回一个承诺? – Tyrsius 2013-05-14 03:11:53
当路由器导航到视图/虚拟机时,激活函数被框架(Durandal)自动调用。 filterType只是一个带有整数值的ko.observable。 – 2013-05-14 03:27:50
好的,所以当你设置'filterType'时会触发一个动画?这是来自订户吗?您可能希望将其作为init()的一部分,以便它返回的承诺适用于这两种情况。 – Tyrsius 2013-05-14 03:44:20