2

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 つに分割して基本モデルから継承することもできましたが、もっと簡単な解決策を望んでいました。

4

2 に答える 2

1

ko.cleanNode()div を含むアイテムを使用して、ナビゲーションの前に ko バインディングを削除するだけで問題を解決できました。

于 2013-05-15T08:46:20.657 に答える