【发布时间】:2013-05-14 02:20:27
【问题描述】:
我有 3 条路线:items/one、items/two 和 items/three,它们都指向“items”vm/view。
在 items.js 的激活函数中,我正在检查 url,并在此基础上更改过滤器:
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');
}
这一切正常,我在视图上得到了正确的过滤器。但是,我注意到,如果我在“一”上,然后转到“二”,则 ko 绑定变量会“实时”更新,也就是说,随着它们的变化,在激活之前promise 解析,这会导致转换发生两次(在抓取数据时,以及在激活函数返回之后)。
这只发生在这种情况下,其中视图和视图模型与前一个相同。我知道这是一种特殊情况,路由器可能正在使用 areSameItem = true 处理新路由的加载。我可以将虚拟机/视图分成三个并尝试从基本模型继承,但我希望有一个更简单的解决方案。
【问题讨论】:
-
它在调用你的
activate函数吗?filterType()会返回承诺吗? -
当路由器导航到视图/虚拟机时,框架 (Durandal) 会自动调用激活函数。 filterType 只是一个带有整数值的 ko.observable。
-
好的,所以当你设置
filterType时会触发动画?是来自订阅者吗?您可能希望它成为init()的一部分,以便它返回的承诺适用于两种情况。