Правильно, я сделал что-то довольно прямолинейное. См. Это plnkr для более подробной информации.
userHttpService
обычно обертывает $http
, но поскольку у меня нет конечной точки, чтобы на самом деле ударить, я подделываю обещание, используя библиотеку $q
.
routeConfig
- это провайдер, который вы можете настроить в режиме конфигурации для настройки маршрутов, к которым вы можете перейти. Если вы используете что-то вроде ui router, вы можете сделать что-то гораздо более элегантное с объектом settings
по настройке маршрута. Если вы хотите увидеть что-то гораздо более элегантное и продвинутое, посмотрите на это repo.
Конфигурационный идет как так:
app.config(function($routeProvider, $locationProvider, routeConfigProvider) {
$routeProvider.when('/home', { template: '<h2>Home</h2><p>Please do something</p>' })
$routeProvider.when('/login', { controller: 'LoginController', template: '<h2>Login</h2><div><p><span>Name:</span><input type="text" ng-model="name" /></p><p><span>Password:</span><input type="password" ng-model="password" /></p></div><div><p><button type="submit" ng-click="login()">Login</button></p></div><div><p>{{error}}</p></div>' });
$routeProvider.when('/profile', { controller: 'ProfileController', template: '<h2>Profile</h2><div><p><span>Name:</span>{{name}}</p></div>' });
$routeProvider.otherwise('/home');
$locationProvider.html5Mode(true);
routeConfigProvider.addRouteWhenLoggedIn('/profile');
routeConfigProvider.addRouteWhenLoggedIn('/home');
routeConfigProvider.addRouteWhenLoggedOut('/home');
routeConfigProvider.addRouteWhenLoggedOut('/login');
});
Я просто в комплекте все мои шаблоны в там для моей собственной простоты использования. Я втягиваю свой routeConfigProvider
(обратите внимание, что вы не добавляете Provider
, когда вы назовете его .provider('routeConfig', ...
, угловое сделает это за вас).
Затем я собираюсь добавлять маршруты к различным таблицам, одна таблица предназначена для маршрутов, на которые вы можете перейти, когда вы вошли в систему, а другая - для маршрутов, на которые вы можете перейти, когда вы вошли в систему вне.
Ниже приведено фактическое действие навигации по маршруту.
app.run(function ($rootScope, routeConfig, userService) {
$rootScope.$on('$routeChangeStart', function (e, c, p) {
var topath = c.$$route.originalPath;
if (userService.isLoggedIn()) {
if (!routeConfig.isAllowedWhenLoggedIn(topath)){
e.preventDefault();
// you can use $location.path to redirect if you wish
}
} else {
if (!routeConfig.isAllowedWhenLoggedOut(topath)){
e.preventDefault();
// you can use $location.path to redirect if you wish
}
}
});
});
Он довольно прост, он использует userService
(помните, что это не userHttpService
так это несет ответственность за Dishing из пользователя конкретные вещи) и спрашивает, является ли пользователь вошел в систему. Тогда он будет искать либо таблицу маршрута, чтобы проверить, разрешено ли им перемещаться по маршруту.
e.PreventDefault()
- как вы предотвращаете навигацию.
Прежде всего, чтобы улучшить код, вы захотите отвлечь логический знак в своей собственной фабрике. –
@CallumLinington как? Можете ли вы дать мне пример? – loveyourserlf
работаю над этим, дайте мне мин –