У меня проблема с изменением 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'];
Кто-нибудь может мне помочь, пожалуйста?
Ответы:
Несколько дней назад у меня была похожая проблема. В моем случае проблема заключалась в том, что я изменил что-то с помощью сторонней библиотеки (если быть точным, jQuery), и в этом случае, хотя функции вызова и установка переменных работают, Angular не всегда распознает, что есть изменения, поэтому он никогда не переваривает.
Попробуйте использовать
$scope.$apply()
сразу после того, как вы изменили местоположение и позвонили,replace()
чтобы сообщить Angular, что все изменилось.источник
Вместо того,
$location.path(...)
чтобы изменять или обновлять страницу, я воспользовался сервисом$window
. В Angular эта служба используется как интерфейс дляwindow
объекта, аwindow
объект содержит свойство,location
которое позволяет вам обрабатывать операции, связанные с местоположением или URL-адресом.Например, с помощью
window.location
вы можете назначить новую страницу, например:Или обновите его, например:
У меня это сработало. Это немного отличается от ожидаемого, но работает для поставленной цели.
источник
У меня была такая же проблема, но мой вызов $ location УЖЕ был в дайджесте. Вызов $ apply () только что дал ошибку процесса $ дайджест.
Этот трюк сработал (и обязательно введите его
$location
в свой контроллер):Хотя не знаю, зачем это было нужно ...
источник
Мне пришлось встроить свое
$location.path()
утверждение вот так, потому что мой дайджест все еще работал:источник
В моем случае проблема заключалась в отсутствии индикатора необязательного параметра ('?') В моей конфигурации шаблона.
Например:
Без символа запроса маршрут, очевидно, не изменился бы при подавлении параметра маршрута.
источник
Если кто-то из вас использует Angular-ui / ui-router, используйте:
$state.go('yourstate')
вместо$location
. Это помогло мне.источник
Это работает для меня (в CoffeeScript)
источник
На мой взгляд, многие ответы здесь кажутся немного взломанными (например, $ apply () или $ timeout), поскольку возня с $ apply () может привести к нежелательным ошибкам.
Обычно, когда $ location не работает, это означает, что что-то не было реализовано угловым способом.
В этом конкретном вопросе проблема, похоже, заключается в неугловой части AJAX. У меня была похожая проблема, когда перенаправление с использованием $ location должно происходить после выполнения обещания. Я хочу проиллюстрировать проблему на этом примере.
Старый код:
Примечание: taskService.createTask возвращает обещание.
$ q - угловой способ использования обещаний:
Использование $ q для разрешения обещания решило проблему перенаправления.
Подробнее о сервисе $ q: https://docs.angularjs.org/api/ng/service/ $ q
источник
это должно решить вашу проблему.
источник