3

私は問題があります。私は登録フォームと他の多くのフォームを持っています。ここで、フォームが汚れているかどうかを確認し、本当にこのページを離れたい/閉じたい場合は確認ボックスを表示します。
まず第一に、他のボタンではなくブラウザの戻るボタンで戻ると ([ボタン..] ちょうど 4 つの例)、確認ボックスが 2 回表示され、2 回確認しても同じページにいることを確認した後、フォームがリセットされるだけです。自分で押すと、すべて正常に動作します。
次に、ブラウザを閉じると、確認ボックスが表示され、その後ブラウザの確認ボックスも表示されますが、そのうちの 1 つだけが必要です。

$scope.$on('$locationChangeStart', function (event, next, current) {
    if ($scope.requestForm.$dirty) {
        if (!$window.confirm('Unsaved Changes, leave Page?')) {
            //cancel leaving view2
            //works when clicking links, but doesn't work when using the back button
            event.preventDefault();
        }
    } else {

    }
});

$scope.$watch("requestForm.$dirty", function (newval) {
    window.myGlobalDirtyFlag = newval;
});

window.onbeforeunload = function (e) {
    if (window.myGlobalDirtyFlag === true) {
        if (!$window.confirm('Unsaved Changes, close Page?')) {
            //cancel leaving view2
            //works when clicking links, but doesn't work when using the back button
            return false;
        } else {

        }
    }
};

$scope.$on("$destroy", function () {
    window.myGlobalDirtyFlag = false;
});

これを AngularJS ディレクティブに組み込む方法を誰かが知っているかもしれません。そのため、フォームがあるすべてのサイトにこのコードをコピーする必要はありません。(すべてのページには 1 つのフォームしかありませんが、すべてのフォーム名は異なります!)
私のコントローラーは別の JavaScript ファイル (function blablaController() {}) にあり、これを構成ファイル (templateUrl: blabla.html, controller) の routeProvider ごとに渡します。 : blabalController)

よろしく、
炭疽菌

4

1 に答える 1

5

これがあなたの質問に答えるサービスとディレクティブです。$windowおそらく、サービス内でウィンドウの代わりに使用することを検討する唯一の変更です。unsaved-changes-warning説明にあるように、属性をフォームに追加するだけです。

https://github.com/facultymatt/angular-unsavedChanges

于 2013-10-15T15:41:47.070 に答える