私は Javascript と backbone.js を初めて使用するので、ここで単純なものが欠けていることを願っています。ユーザーが別のページに移動できるようにする前に、保存されていない変更をチェックすることになっているサンプルコードを試しています。ここでJSfiddleを作成しました:
コードは、次のように 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
、常に確認を求めなければなりません)。または、より良いアプローチがある場合は、代替案を受け入れます。