我有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