1

私は Javascript と backbone.js を初めて使用するので、ここで単純なものが欠けていることを願っています。ユーザーが別のページに移動できるようにする前に、保存されていない変更をチェックすることになっているサンプルコードを試しています。ここでJSfiddleを作成しました:

http://jsfiddle.net/U43T5/4/

コードは、次のように hashchange イベントをサブスクライブします。

$(window).on("hashchange", router.hashChange);

そして、router.hashChange関数は次のように「ダーティ」フラグをチェックして、ナビゲーションを許可するかどうかを決定します。

hashChange: function (evt) {
    if (this.cancelNavigate) { // cancel out if just reverting the URL
        evt.stopImmediatePropagation();
        this.cancelNavigate = false;
        return;
    }
    if (this.view && this.view.dirty) {
        var dialog = confirm("You have unsaved changes. To stay on the page, press cancel. To discard changes and leave the page, press OK");
        if (dialog == true) return;
        else {
            evt.stopImmediatePropagation();
            this.cancelNavigate = true;
            window.location.href = evt.originalEvent.oldURL;
        }
    }
},

問題は、 is が原因でコードが機能していないことthis.viewですundefined。そのため、2 番目の if ブロックは決して入力されません。

サンプル プログラムで、ページから移動する前に常に確認を求めるようにしたいと思います (私のサンプル プログラムでは、常に確認を求めるように設定this.view.dirtyしているためtrue、常に確認を求めなければなりません)。または、より良いアプローチがある場合は、代替案を受け入れます。

4

2 に答える 2

1

主な問題はthis、メソッドのコンテキストであり、ルーターではなくWindow オブジェクトthisに対応します。したがって、ルーターでビューを定義しているため、常に未定義のままです。メソッド内のコンテキストをルーターにバインドする初期化メソッドを宣言します。

 initialize: function() {
        _.bindAll(this, 'loadView', 'hashChange');
    },

フィドルをチェック

于 2013-07-26T17:42:11.917 に答える
0

少なくともまともなものを作るのに多くの時間を費やしました。

バックボーン関数のラッパーを書くことになりました:

    var ignore = false;

    Backbone.history.checkUrl = function() {

            if (ignore) {
                ignore = false;
                return;
            }

            app.dirtyModelHandler.confirm(this, function () {
                Backbone.History.prototype.checkUrl.call(Backbone.history);
            },
            function() {
                ignore = true;
                window.history.forward();

            });

    };

app.dirtyModelHandler.confirm は、確認 (Ok、キャンセル) ビューを表示し、成功関数とキャンセル関数を引数として取る関数です。

于 2015-09-14T16:44:34.927 に答える