3

私は次のものを持っています:

function activate(routeData) {
    // make dataservice call, evaluate results here.  If condition is met, reroute:
    if (true){
       router.navigateTo("#/someRoute");
     }
    alert ("should not be shown");
}

ただし、アラートが発生するとビューが変更されます。

現在の項目から完全に離れて、その vm 内のそれ以上のコードがヒットしないようにするにはどうすればよいですか?

アップデート:

使用してみguardrouteましたが、再ルーティングするかどうかを決定するデータを返すデータサービスを呼び出すには、viewModel をアクティブにする必要があります。Guardroute を使用すると、データサービスが呼び出されるのを完全に防ぐことができます (アクティブ化関数では何もヒットしないため)。

私もifブロックから戻ってみましたが、これはまだview / viewAttached / etcをロードしているため、UXに不具合があります。

4

5 に答える 5

14

Durandal 2.0では、次のことがうまくいきました。

    canActivate: function() {
        if(condition)
            return {redirect: 'otherRoute'};
        return true;
    }

    activate: // Do your stuff

ドキュメントに記載されています:http://durandaljs.com/documentation/Using-The-Router.html

于 2013-09-20T07:29:33.793 に答える
3

これは、 Google グループでの非常によく似たディスカッションに対する @EisenbergEffect の回答です。

ビュー モデルに canActivate を実装します。false の promise を返し、リダイレクトでチェーンします。

@JosepfGabriel の例 (ディスカッション) を Durandal 1.2 で試してみることをお勧めします。routerDurandal バージョンの正しい構文を確認してくださいrouter.navigateTo("#/YourHash", 'replace')

canActivate: function () {
    return system.defer(function (dfd) {
        //if step 2 has a problem
        dfd.resolve(false);
    })
    .promise()
    .then(function () { router.navigate("wizard/step1", { trigger: true, replace: true }); });
}

ただし、これは Durandal 2.0 では機能せず、機能リクエストhttps://github.com/BlueSpire/Durandal/issues/203があります。

于 2013-06-28T08:02:09.927 に答える
0

if (true) ブロックに return を追加すると、これが修正されます。

function activate(routeData) {
    if (true){
       router.navigateTo("#/someRoute");
       return;
     }
    alert ("should not be shown");
}
于 2013-06-27T12:46:27.957 に答える