15

angularjsの達人がこれで私を助けてくれることを願っています。ここに私のangularjsコードがあります

$scope.$on('$routeChangeStart', function(event, next, current) {
                if ($scope.myForm.$dirty) {
                    if(!confirm("Unsaved, do u want to continue?")) {
                        event.preventDefault();
                    }
                }
            });

データが汚れている場合はブラウザの戻るボタンのクリックで警告しますが、[キャンセル] または [OK] をクリックすると、ルートの変更が完了しevent.preventDefault()ます。動作していないようです。何が間違っているのか誰でも指摘できますか

4

5 に答える 5

33

これを見つけるのにかなり苦労しましたが、「$routeChangeStart」イベントの代わりに、「$locationChangeStart」イベントをリッスンできます。これにより、デフォルトを防ぐことができます。

$scope.$on("$locationChangeStart", function(event, next, current) {
    if (!confirm("You have unsaved changes, continue navigating to " + next + " ?")) {
        event.preventDefault();
    }
});

また、デフォルトを常に防止し、「次へ」を保存し、きれいな JS モーダルを表示して、非同期で決定することもできます。

$locationChangeStart は現在文書化されていませんが、ここで参照されています: https://github.com/angular/angular.js/issues/2109

于 2013-03-19T14:50:23.460 に答える
5

Angular 1.3.7 の直後に修正されました https://code.angularjs.org/1.3.7/docs/api/ngRoute/service/ $route

$routeChangeStart ルート変更前にブロードキャストされます。この時点で、ルート サービスは、ルート変更の発生に必要なすべての依存関係の解決を開始します。通常、これには、ビュー テンプレートと、解決ルート プロパティで定義された依存関係のフェッチが含まれます。すべての依存関係が解決されると、$routeChangeSuccess が起動されます。

ルートの変更 (およびそれをトリガーした $location の変更) は、イベントの preventDefault メソッドを呼び出すことで防ぐことができます。イベント オブジェクトの詳細については、$rootScope.Scope を参照してください。

于 2015-02-05T18:01:22.750 に答える
3

AngularJS のドキュメント($broadcast を参照) によると、ブロードキャスト タイプのイベントをキャンセルすることはできません( $routeChangeStartはそのタイプです)。

イベント ライフ サイクルは、$broadcast が呼び出されたスコープで開始します。このスコープで name イベントをリッスンしているすべてのリスナーが通知を受け取ります。その後、イベントは現在のスコープのすべての直接および間接スコープに伝播し、途中ですべての登録済みリスナーを呼び出します。イベントはキャンセルできません。

于 2013-02-15T13:25:52.247 に答える
2

この問題は、最新バージョン (>= 1.3.8) で修正されました。

$routeChangeStart に指定された引数はより詳細 (そして多くの場合、より便利) であるため、可能であれば、Angular バージョンを更新してみてください ...

于 2015-01-16T18:21:32.290 に答える