9

サミーとのすべてのルート変更をインターセプトして、保留中のアクションがあるかどうかを最初に確認したいと思います。APIを使用してこれを実行しましたが、sammy.beforefalseを返してルートをキャンセルします。これにより、ユーザーは「ページ」にとどまりますが、それでもブラウザのアドレスバーのハッシュが変更され、ブラウザの履歴にルートが追加されます。ルートをキャンセルした場合、アドレスバーにも履歴にも表示されたくありませんが、代わりにアドレスは同じままであると期待しています。

現在、これを回避するには、window.history.back(yuk)を呼び出して履歴の元の場所に戻るか、sammy.redirectを呼び出すことができます。どちらも理想的とは言えません。

sammyにルートを本当にキャンセルさせて、現在のルート/ページにとどまり、アドレスバーをそのままにして、履歴に追加しないようにする方法はありますか?

そうでない場合、これを行う別のルーティングライブラリはありますか?

sammy.before(/.*/, function () {
    // Can cancel the route if this returns false
    var response = routeMediator.canLeave();

if (!isRedirecting && !response.val) {
    isRedirecting = true;
    // Keep hash url the same in address bar
    window.history.back();
    //this.redirect('#/SpecificPreviousPage'); 
}
else {
    isRedirecting = false;
}
return response.val;
});
4

4 に答える 4

17

他の誰かがこれにぶつかった場合に備えて、ここが私が終わった場所です。context.setLocationルートのリセットを処理するためにサミーの機能を使用することにしました。

sammy.before(/.*/, function () {
    // Can cancel the route if this returns false
    var
        context = this,
        response = routeMediator.canLeave();

    if (!isRedirecting && !response.val) {
        isRedirecting = true;
        toastr.warning(response.message); // toastr displays the message
        // Keep hash url the same in address bar
        context.app.setLocation(currentHash);
    }
    else {
        isRedirecting = false;
        currentHash = context.app.getLocation();
    }
    return response.val;
});
于 2012-06-21T14:21:38.837 に答える
1

質問と回答で提供されたコードを使用する場合、キャンセルしたルートも今後のすべての呼び出しでブロックされることに注意する必要があります。routeMediator.canLeaveは再度評価されません。これでは、ルートを2回呼び出して、現在の状態に応じてキャンセルすることはできません。

于 2012-12-18T15:37:47.337 に答える
0

ジョン・パパがSPA/ノックアウトコースでSammyJSを使用したときと同じ結果を出すことができました。

私はCrossroadsJSをルーターとして使用しました。これは、ブラウザーによって「送信された」URLの変更をリッスンするためにHasherJSに依存しています。

コードサンプルは次のとおりです。

hasher.changed.add(function(hash, oldHash) {
    if (pageViewModel.isDirty()){
        console.log('trying to leave from ' + oldHash + ' to ' + hash);

        hasher.changed.active = false;
        hasher.setHash(oldHash);
        hasher.changed.active = true;

        alert('cannot leave. dirty.');
    }
    else {
        crossroads.parse(hash);
        console.log('hash changed from ' + oldHash + ' to ' + hash);
        }
});
于 2016-01-02T10:04:29.857 に答える
0

以前のプロジェクトを再検討し、同様の状況に陥った後、他の誰かがここに指示された場合に備えて、別のアプローチを共有したいと思いました。

必要だったのは、基本的に、ページをインターセプトし、資格情報に基づいてリダイレクトするための最新の「認証ガード」パターンでした。

うまく機能したのはSammy.around(callback)、ここで定義されているように使用することでした: Sammy.js docs:Sammy.Application around(callback)

次に、次のようにします...

(function ($) {
    var app = Sammy("body");

    app.around(checkLoggedIn);

    function canAccess(hash) {
        /* access logic goes here */
        return true;
    }

    // Authentication Guard
    function authGuard(callback) {
        var context = this;
        var currentHash = app.getLocation();
        if (!canAccess(currentHash)) {
            // redirect
            context.redirect("#/login");
        }
        else {
            // execute the route path
            callback();
        }
    };

})(jQuery);
于 2016-09-19T23:08:30.900 に答える