Как проехать без шаблонаUrl?
Ok. У меня есть настройка url для входа пользователя в систему. На сервере нет html. Сеанс на сервере просто уничтожается, а затем пользователь перенаправляется на адрес.
Это отлично работает с простым html, но с Angular у меня возникают проблемы. Я маршрутизировал все основные маршруты, используя $routeProvider.when('/foo', {templateUrl: '/foo.html', controller: 'Ctrl'})
, и это нормально работает для обычных шаблонов. Однако, если нет шаблона, он не будет работать.
Итак, как я поддерживаю маршрут /logout
так же, как описано выше, когда нет шаблона html?
Ответы
Ответ 1
Обходным путем является использование template
вместо templateUrl
. Из Angular docs:
template - {string =} - html-шаблон в качестве строки, которая должна использоваться по директивам ngView или ngInclude. это свойство имеет приоритет над templateUrl.
Это можно использовать следующим образом:
$routeProvider.when("/foo", {template: " ", controller: "Ctrl"});
Примечание. Вместо пустой строки ""
вы должны использовать " "
, потому что Angular использует проверку if (template)
перед запуском контроллера, а пустая строка - false.
- EDIT -
Лучший способ сделать это - использовать карту resolve
. См. Angular Документы:
resolve - {Object. =} - Дополнительная карта которые должны быть введены в контроллер.
Это можно использовать следующим образом:
$routeProvider.when('/foo', {resolve: {redirect: 'RedirectService'}});
Примечание. Я изменил его с "Ctrl" на "RedirectService", потому что то, что вы описываете в вопросе, на самом деле не является "контроллером" в смысле Angular. Он не настраивает область видимости. Вместо этого он больше похож на сервис, который заканчивается перенаправлением.
Ответ 2
Я пишу решение на основе уже принятого ответа, и проблема github, упомянутая в нем, комментирует.
Подход, который я использую, является параметром resolve
в $routeProvider
. В моем случае я пытался создать хорошее решение для logout в моем приложении, когда пользователь переходит в /logout.
Пример кода $routeProvider
:
app.config(['$routeProvider', function ($routeProvider) {
$routeProvider.
...
when('/logout', {
resolve: {
logout: ['logoutService', function (logoutService) {
logoutService();
}]
},
}).
...
}]);
В части решения вы указываете службу (factory) по имени, а затем должны называть ее. Тем не менее, это лучшее решение.
Чтобы сделать пример, я представляю свой logoutService
:
angular.module('xxx').factory('logoutService', function ($location, Auth) {
return function () {
Auth.setUser(undefined);
$location.path('/');
}
});
Отлично работает!