Местоположение 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);
он должен решить вашу проблему.