AngularJS
Маршрутизация с использованием ngRoute
Поиск…
замечания
ngRoute
- это встроенный модуль, предоставляющий услуги маршрутизации и девелопмента и директивы для угловых приложений.
Полная документация о ngRoute
доступна на https://docs.angularjs.org/api/ngRoute
Основной пример
В этом примере показано, как настроить небольшое приложение с тремя маршрутами, каждый со своим собственным представлением и контроллером, используя синтаксис controllerAs
.
Мы настраиваем наш маршрутизатор с помощью угловой функции .config
- Мы
$routeProvider
в.config
- Мы определяем имена маршрутов в методе
.when
с объектом определения маршрута. - Мы поставляем метод
.when
с объектом, определяющим нашtemplate
илиtemplateUrl
,controller
иcontrollerAs
app.js
angular.module('myApp', ['ngRoute'])
.controller('controllerOne', function() {
this.message = 'Hello world from Controller One!';
})
.controller('controllerTwo', function() {
this.message = 'Hello world from Controller Two!';
})
.controller('controllerThree', function() {
this.message = 'Hello world from Controller Three!';
})
.config(function($routeProvider) {
$routeProvider
.when('/one', {
templateUrl: 'view-one.html',
controller: 'controllerOne',
controllerAs: 'ctrlOne'
})
.when('/two', {
templateUrl: 'view-two.html',
controller: 'controllerTwo',
controllerAs: 'ctrlTwo'
})
.when('/three', {
templateUrl: 'view-three.html',
controller: 'controllerThree',
controllerAs: 'ctrlThree'
})
// redirect to here if no other routes match
.otherwise({
redirectTo: '/one'
});
});
Затем в нашем HTML мы определяем нашу навигацию с использованием <a>
элементов с href
, для имени маршрута helloRoute
мы будем маршрутизировать как <a href="#/helloRoute">My route</a>
Мы также предоставляем наше представление контейнеру и директиву ng-view
для ввода наших маршрутов.
index.html
<div ng-app="myApp">
<nav>
<!-- links to switch routes -->
<a href="#/one">View One</a>
<a href="#/two">View Two</a>
<a href="#/three">View Three</a>
</nav>
<!-- views will be injected here -->
<div ng-view></div>
<!-- templates can live in normal html files -->
<script type="text/ng-template" id="view-one.html">
<h1>{{ctrlOne.message}}</h1>
</script>
<script type="text/ng-template" id="view-two.html">
<h1>{{ctrlTwo.message}}</h1>
</script>
<script type="text/ng-template" id="view-three.html">
<h1>{{ctrlThree.message}}</h1>
</script>
</div>
Пример параметров маршрута
Этот пример расширяет базовый пример, передавая параметры на маршруте, чтобы использовать их в контроллере
Для этого нам необходимо:
- Настроить положение и имя параметра в названии маршрута
-
$routeParams
услугу$routeParams
в нашем контроллере
app.js
angular.module('myApp', ['ngRoute'])
.controller('controllerOne', function() {
this.message = 'Hello world from Controller One!';
})
.controller('controllerTwo', function() {
this.message = 'Hello world from Controller Two!';
})
.controller('controllerThree', ['$routeParams', function($routeParams) {
var routeParam = $routeParams.paramName
if ($routeParams.message) {
// If a param called 'message' exists, we show it's value as the message
this.message = $routeParams.message;
} else {
// If it doesn't exist, we show a default message
this.message = 'Hello world from Controller Three!';
}
}])
.config(function($routeProvider) {
$routeProvider
.when('/one', {
templateUrl: 'view-one.html',
controller: 'controllerOne',
controllerAs: 'ctrlOne'
})
.when('/two', {
templateUrl: 'view-two.html',
controller: 'controllerTwo',
controllerAs: 'ctrlTwo'
})
.when('/three', {
templateUrl: 'view-three.html',
controller: 'controllerThree',
controllerAs: 'ctrlThree'
})
.when('/three/:message', { // We will pass a param called 'message' with this route
templateUrl: 'view-three.html',
controller: 'controllerThree',
controllerAs: 'ctrlThree'
})
// redirect to here if no other routes match
.otherwise({
redirectTo: '/one'
});
});
Затем, с внесением любых изменений в наши шаблоны, добавив новую ссылку с настраиваемым сообщением, мы можем увидеть новое настраиваемое сообщение на наш взгляд.
index.html
<div ng-app="myApp">
<nav>
<!-- links to switch routes -->
<a href="#/one">View One</a>
<a href="#/two">View Two</a>
<a href="#/three">View Three</a>
<!-- New link with custom message -->
<a href="#/three/This-is-a-message">View Three with "This-is-a-message" custom message</a>
</nav>
<!-- views will be injected here -->
<div ng-view></div>
<!-- templates can live in normal html files -->
<script type="text/ng-template" id="view-one.html">
<h1>{{ctrlOne.message}}</h1>
</script>
<script type="text/ng-template" id="view-two.html">
<h1>{{ctrlTwo.message}}</h1>
</script>
<script type="text/ng-template" id="view-three.html">
<h1>{{ctrlThree.message}}</h1>
</script>
</div>
Определение пользовательского поведения для отдельных маршрутов
Простейший способ определения индивидуального поведения для отдельных маршрутов будет довольно простым.
В этом примере мы используем его для аутентификации пользователя:
1) routes.js
: создать новое свойство (например, requireAuth
) для любого желаемого маршрута
angular.module('yourApp').config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/home', {
templateUrl: 'templates/home.html',
requireAuth: true
})
.when('/login', {
templateUrl: 'templates/login.html',
})
.otherwise({
redirectTo: '/home'
});
}])
2) В контроллере верхнего уровня, не связанный с элементом внутри ng-view
(чтобы избежать конфликта с угловым $routeProvider
), проверьте , если newUrl
имеет requireAuth
свойства и действовать соответствующим образом
angular.module('YourApp').controller('YourController', ['$scope', 'session', '$location',
function($scope, session, $location) {
$scope.$on('$routeChangeStart', function(angularEvent, newUrl) {
if (newUrl.requireAuth && !session.user) {
// User isn’t authenticated
$location.path("/login");
}
});
}
]);