Angular - тот же Url "/", но с разными шаблонами, основанными на статусе пользователя, зарегистрированного в статусе
Я пытаюсь создать два разных шаблона. Одна из них - целевая страница для зарегистрированных пользователей, описывающих бизнес и другую страницу панели мониторинга, если пользователь вошел в систему.
Я прочитал этот другой стек о том, как это сделать с помощью UI-маршрутизатора. Я хотел бы узнать, как лучше всего сделать что-то подобное, используя ngRoute?
Как показано ниже, "/frontdesk" - это панель управления, а "/" - целевая страница для выведенных из системы пользователей. НО! Я хочу, чтобы URL-адрес был одинаковым для того, находится ли пользователь на панели мониторинга или выведен из системы и отправлен на целевую страницу! Я не хочу "/frontdesk", я хочу "/" для IndexController и FrontdeskController.
Вот моя маршрутизация JS.
(function () {
'use strict';
angular
.module('resonanceinn.routes')
.config(config);
config.$inject = ['$routeProvider'];
function config($routeProvider) {
$routeProvider
.when('/', { // This is the landing Page
controller: 'IndexController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/layout/index.html'
})
.when('/frontdesk', { //This is logged in user that I want to become '/' as well
controller: 'FrontdeskController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/frontdesk/frontdesk.html'
})
.when('/register', {
controller: 'RegisterController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/authentication/register.html'
})
.when('/login', {
controller: 'LoginController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/authentication/login.html '
})
.when('/:username', {
controller: 'ProfileController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/profiles/profile.html'
})
.when('/:username/settings', {
controller: 'ProfileSettingsController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/profiles/settings.html'
}).otherwise('/');
}
})();
Решение!
Спасибо всем за ваши ответы.
Благодаря @ThibaudL для лучшего решения.
Вот как я это сделал:
В Routes.js
.when('/', {
controller: 'MainController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/layout/Main.html'
Main.html
<div ng-include="" src="'/static/javascripts/layout/index.html'" ng-if="auth"></div>
<div ng-include="" src="'/static/javascripts/frontdesk/frontdesk.html'" ng-if="!auth"></div>
MainController.js
(function () {
'use strict';
angular
.module('resonanceinn.layout.controllers')
.controller('StartController', StartController);
StartController.$inject = ['$scope', '$route', '$routeParams', '$location', 'Authentication'];
function StartController($scope, $route, $routeParams, $location, Authentication) {
$scope.auth = Authentication.isAuthenticated();
}
})();
Итак, теперь, если пользователь аутентифицирован, он просто переключает шаблоны на панель пользователей.
Я добавил новый div с ng-контроллером для каждого шаблона, чтобы каждый шаблон имел свои отдельные контроллеры.
Ответы
Ответ 1
Что бы я сделал:
main.html
<div ng-include="" src="'/static/javascripts/layout/index.html'" ng-if="auth"></div>
MainController.js
(function () {
'use strict';
angular
.module('App.layout.controllers')
.controller('MainController', MainController);
MainController.$inject = ['$scope', '$route', '$routeParams', '$location', 'Authentication'];
function MainController($scope, $route, $routeParams, $location, Authentication) {
$scope.auth = Authentication;
});
}
})();
Ответ 2
Добавьте другое свойство, например isGuest: true
.when('/', {
controller: 'IndexController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/layout/index.html',
isGuest: true
})
.... ...............
и
app.run(function($rootScope, $state, Session) {
$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
if (toState.isGuest == true && Session.isAuthenticated()) {
// User isn’t authenticated
// do redirection to guest user
event.preventDefault();
}
if (toState.authentication == true && !Session.isAuthenticated()) {
// do redirection to loggedin user
event.preventDefault();
}
});
});
Вы можете написать свой собственный сервис Session
,
Session.isAuthenticated()
//возвращает true
или false
на основе того, является ли пользователь гостевой или loggedin
Ответ 3
Вы можете использовать свойство разрешения, чтобы проверить, зарегистрирован ли пользователь.
$routeProvider
.when('/somepage' ,{
templateUrl: "templates/template.html",
resolve:{
"check":function($location){
if('Your Condition'){
//Do something
}else{
$location.path('/'); //redirect user to home.
alert("You don't have access here");
}
}
}
})
Ответ 4
Ввести $locationProvider с помощью $routeProvider
config.$inject = ['$locationProvider'];
то
function config($routeProvider, $locationProvider ) {
$routeProvider
.when('/', {
controller: 'IndexController',
controllerAs: 'vm',
template: " "
})
...
обратите внимание на свой шаблон not templateUrl, также шаблон "просто отметьте" "
затем в вашем указательном контроллере
.controller('IndexController', function($scope, $route, $routeParams, $location) {
if ($scope.user.loggedIn) $location.path('/:user'); else $location.path('/:visitor');})
обратите внимание на тот же путь, что и '/', но /: пользователь для пользователей loggedIn и /: посетитель для анонимного
Ответ 5
есть несколько вещей, которые вы можете сделать, самое простое, проверяя статус вошедшего в начале вашего FrontdeskController и переходите на домашнюю страницу, если вы не вошли в систему.
вы также можете добавить переменные на маршруте и проверить их как в предыдущем ответе.
есть более экстремальные случаи, которые вы можете сделать, и я считаю, что это очень плохая практика, например, создание страницы шаблонов с двойным состоянием, но опять же, это не очень хорошо.
Я надеюсь, что это помогло
Ответ 6
Для templateUrl вы можете использовать такую функцию, как
templateUrl : function(parameter) {
if(loggedin) {
return '/static/javascripts/layout/index.html';
} else {
return 'logged out page';
}
}
Вы можете читать $routeProvider,
templateUrl - {string = | function() =} - путь или функция, которая возвращает путь к шаблону html, который должен использоваться ngView.
Если templateUrl является функцией, он будет вызываться со следующими параметрами:
{Array & л.; Object > } - параметры маршрута, извлеченные из текущего $location.path(), путем применения текущего маршрута
Ответ 7
Здесь полное решение:
var app = angular.module('app', ['ngRoute']);
app.config(function($routeProvider) {
$routeProvider
.when('/', {
controller: 'IndexController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/layout/index.html'
})
.when('/frontdesk', {
controller: 'FrontdeskController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/frontdesk/frontdesk.html',
requireLogin: true
});
});
app.factory('authService', function () {
var service = {
isAuthenticated: false,
loginPageUrl: '/login'
};
return service;
});
app.run(function ($rootScope, $location, authService) {
$rootScope.$on('$routeChangeStart', function (event, next) {
if (angular.isDefined(next) && next !== null && angular.isDefined(next.requireLogin)) {
if (next.requireLogin === true && !authService.isAuthenticated) {
event.preventDefault();
$location.path(authService.loginPageUrl);
}
}
});
});
Ответ 8
Первая попытка
.
В Routes.js
.when('/', {
controller: 'MainController',
controllerAs: 'vm',
templateUrl: '/static/javascripts/layout/Main.html'
Main.html
<div ng-include="mainTemplate"></div>
MainController.js
(function () {
'use strict';
angular
.module('App.layout.controllers')
.controller('MainController', MainController);
MainController.$inject = ['$scope', '$route', '$routeParams', '$location', 'Authentication'];
function MainController($scope, $route, $routeParams, $location, Authentication) {
$scope.$watch(function($scope) {
return $scope.mainTemplate = Authentication.isAuthenticated() ? '/static/javascripts/layout/index.html' : '/static/javascripts/frontdesk/frontdesk.html';
});
}
})();
Итак, теперь, если пользователь аутентифицирован, он просто переключает шаблоны на панель пользователей.
Я добавил новый div с ng-контроллером для каждого шаблона, чтобы каждый шаблон имел свои отдельные контроллеры.