Местоположение AngularJS $не меняет путь

У меня возникла проблема с изменением URL-адреса страницы после отправки формы.

Здесь поток моего приложения:

  • Маршруты установлены, URL-адрес распознается на какой-либо странице формы.
  • Загрузка страницы, переменные наборов контроллеров, директивы запускаются.
  • Устанавливается специальная директива формы, которая выполняет специальную отправку формы с использованием AJAX.
  • После выполнения AJAX (Angular не заботится о AJAX), тогда обратный вызов запускается, и директива вызывает функцию $scope.onAfterSubmit, которая устанавливает местоположение.

Проблема заключается в том, что после установки местоположения ничего не происходит. Я попытался установить параметр местоположения на /, а также... Нет. Я также пробовал не отправлять форму. Ничего не работает.

Я тестировал, достигает ли код функции 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'];

Может кто-нибудь помочь мне?

Ответ 1

У меня была аналогичная проблема несколько дней назад. В моем случае проблема заключалась в том, что я поменял вещи на стороннюю библиотеку (точнее, jQuery), и в этом случае, даже если вызывающие функции и настройка переменных работают Angular, не всегда признают, что есть изменения, поэтому они никогда не перевариваются.

$apply() используется для выполнения выражения в Angular извне структуры Angular. (Например, из событий браузера DOM, setTimeout, XHR или сторонних библиотек).

Попробуйте использовать $scope.$apply() сразу после того, как вы изменили местоположение и назвали replace(), чтобы Angular знал, что все изменилось.

Ответ 2

Вместо $location.path(...), чтобы изменить или обновить страницу, я использовал сервис $window, в Angular эта служба используется как интерфейс к объекту window, а объект window содержит свойство location, которое позволяет обрабатывать операции, связанные с местоположением или содержимым URL.

Например, с помощью window.location вы можете назначить новую страницу, например:

$window.location.assign('/');

Или обновите его, например:

$window.location.reload();

Это сработало для меня. Это немного отличается от вас, но работает для данной цели.

Ответ 3

У меня была такая же проблема, но мой вызов в $location был УЖЕ в дайджесте. Вызов $apply() просто дал $digest уже в ошибке процесса.

Этот трюк работал (и не забудьте ввести $location в ваш контроллер):

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

Не знаю, почему это было необходимо...

Ответ 4

Мне пришлось встроить мой оператор $location.path(), как это, потому что мой дайджест продолжал работать:

       function routeMe(data) {                
            var waitForRender = function () {
                if ($http.pendingRequests.length > 0) {
                    $timeout(waitForRender);
                } else {
                    $location.path(data);
                }
            };
            $timeout(waitForRender);
        }

Ответ 5

В моем случае проблема заключалась в необязательном параметре ('?'), отсутствующем в моей конфигурации шаблона.

Например:

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


$location.path('/abc');

Без символа запроса маршрут, очевидно, не изменит подавление параметра маршрута.

Ответ 6

Если какой-либо из вас использует Angular -ui/ui-router, используйте $state.go('yourstate') вместо $location. Это помогло.

Ответ 7

Это для меня (в CoffeeScript)

 $location.path '/url/path'
 $scope.$apply() if (!$scope.$$phase)

Ответ 8

setTimeout(function() { $location.path("/abc"); },0);

он должен решить вашу проблему.