129

フォームの送信後にページのURLを変更する際に問題が発生しました。

これが私のアプリの流れです:

  1. ルートが設定され、URLが何らかのフォームページに認識されます。
  2. ページの読み込み、コントローラーの設定変数、ディレクティブの起動。
  3. AJAXを使用して特別なフォームの送信を実行する特別なフォームディレクティブが起動されます。
  4. AJAXが実行された後(AngularはAJAXを処理しません)、コールバックが発生し、ディレクティブは$scope.onAfterSubmit場所を設定する関数を呼び出します。

問題は、場所を設定した後は何も起こらないことです。locationparamもに設定してみまし/た...いいえ。また、フォームを送信しないようにしました。何も機能しません。

コードが関数に到達するかどうかをテストしましたonAfterSubmit(到達するかどうか)。

私の唯一の考えは、関数のスコープが(ディレクティブから呼び出されたために)何らかの形で変更されたということonAfterSubmitですが、スコープが変更された場合、どのように呼び出すことができますか?

これが私のコードです

var Ctrl = function($scope, $location, $http) {
  $http.get('/resources/' + $params.id + '/edit.json').success(function(data) {
    $scope.resource = data;
  });

  $scope.onAfterSubmit = function() {
    $location.path('/').replace();
  };
}
Ctrl.$inject = ['$scope','$location','$http'];

誰かが私を助けてくれますか?

4

9 に答える 9

303

私は数日前に同様の問題を抱えていました。私の場合、問題はサードパーティのライブラリ(正確にはjQuery)で変更したことでした。この場合、関数の呼び出しと変数の設定は機能しますが、Angularは変更があることを常に認識しないため、ダイジェストされません。

$ apply()は、Angularフレームワークの外部からAngularで式を実行するために使用されます。(たとえば、ブラウザーのDOMイベント、setTimeout、XHR、またはサードパーティのライブラリから)。

場所を変更し、Angularに電話をかけて、状況が変わったことを知らせ$scope.$apply()た直後に使用してみてください。replace()

于 2012-08-13T10:16:47.920 に答える
28

私はこれと同じ問題を抱えていましたが、 $location への呼び出しはすでにダイジェスト内にありました。$apply() を呼び出すと、 $digest already in process エラーが発生しました。

このトリックはうまくいきました(そして、必ず$locationコントローラーに注入してください):

$timeout(function(){ 
   $location...
},1);

なぜこれが必要なのかわかりませんが...

于 2014-04-03T16:03:57.767 に答える
2

私の場合、問題は、テンプレート構成に欠落しているオプションのパラメーター インジケーター ('?') でした。

例えば:

.when('/abc/:id?', {
    templateUrl: 'views/abc.html',
    controller: 'abcControl'
})


$location.path('/abc');

質問文字がなければ、ルートは明らかに変更されず、ルートパラメーターが抑制されます。

于 2015-09-12T19:54:53.590 に答える
-8
setTimeout(function() { $location.path("/abc"); },0);

それはあなたの問題を解決するはずです。

于 2014-08-30T19:58:12.923 に答える