items/one、items/two、items/three の 3 つのルートがあり、それらはすべて「items」vm/view を指しています。
items.js の activate 関数で、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
}
項目ビューには、1、2、および 3 のボタンを含むメニューがあります。各ボタンは、次のようなアクションにリンクされています。
function clickOne() {
router.navigateTo('#/items/one');
}
function clickTwo() {
router.navigateTo('#/items/two');
}
function clickThree() {
router.navigateTo('#/items/three');
}
これはすべて機能し、ビューに適切なフィルターを取得します。ただし、「1」を使用してから「2」に移動すると、ko バインド変数が「リアルタイム」で、つまり変化するにつれて、アクティブ化の前に更新されることに気付きました。 promise が解決されると、トランジションが 2 回発生します (データが取得されるときと、 activate 関数が返された後)。
これは、ビューとビューモデルが前のものと同じであるこのシナリオでのみ発生します。これは特殊なケースであることは承知しており、ルーターはおそらく areSameItem = true で新しいルートの読み込みを処理しています。VM/View を 3 つに分割して基本モデルから継承することもできましたが、もっと簡単な解決策を望んでいました。