1. ホーム
  2. angularjs

[解決済み] AngularJSの$locationでパスが変更されない

2022-07-20 08:21:53

質問

フォーム送信後にページのURLを変更するのに問題があります。

以下は私のアプリのフローです。

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

問題は、場所を設定した後、何も起こらないということです。試しに location パラメータを / にも設定してみましたが... ダメでした。フォームを送信しないようにすることもやってみました。何も効果がありません。

に到達するかどうかテストしてみました。 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'];

誰か助けてくれませんか?

どのように解決するのですか?

私は数日前に同じような問題がありました。私の場合、問題は私がサードパーティのライブラリ(正確にはjQuery)で何かを変更したことでした。この場合、関数の呼び出しと変数の設定が機能しても、Angularは常に変更があることを認識しないため、決して消化されません。

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

を使ってみてください。 $scope.$apply() を呼び出した後、すぐに replace() を呼び出してAngularに変更されたことを知らせます。