AngularJS
Routering met ngRoute
Zoeken…
Opmerkingen
De ngRoute
is een ngRoute
module met routerings- en deeplinkingservices en richtlijnen voor hoekige apps.
Volledige documentatie over ngRoute
is beschikbaar op https://docs.angularjs.org/api/ngRoute
Basis voorbeeld
Dit voorbeeld toont het instellen van een kleine applicatie met 3 routes, elk met een eigen weergave en controller, met behulp van de syntaxis van de controllerAs
.
We configureren onze router op de hoekige .config
functie
- We injecteren
$routeProvider
in.config
- We definiëren onze
.when
volgens de.when
methode met een route-definitieobject. - We leveren de
.when
methode met een object dat onzetemplate
oftemplateUrl
,controller
encontrollerAs
opgeeft
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'
});
});
Vervolgens definiëren we in onze HTML onze navigatie met behulp van <a>
elementen met href
, voor een routenaam van helloRoute
zullen we routeren als <a href="#/helloRoute">My route</a>
We bieden ook onze visie met een container en de richtlijn ng-view
om onze routes te injecteren.
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>
Voorbeeld van routeparameters
Dit voorbeeld breidt het basisvoorbeeld van het doorgeven van parameters in de route uit om ze in de controller te gebruiken
Om dit te doen moeten we:
- Configureer de parameterpositie en naam in de routenaam
- Injecteer
$routeParams
service in onze controller
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'
});
});
Dan, zonder enige wijzigingen in onze sjablonen aan te brengen en alleen een nieuwe link met aangepast bericht toe te voegen, kunnen we het nieuwe aangepaste bericht in onze weergave zien.
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>
Aangepast gedrag definiëren voor individuele routes
De eenvoudigste manier om aangepast gedrag voor afzonderlijke routes te definiëren, is redelijk eenvoudig.
In dit voorbeeld gebruiken we het om een gebruiker te authenticeren:
1) routes.js
: maak een nieuwe eigenschap (zoals requireAuth
) voor elke gewenste route
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) Bij een top-tier controller die niet gebonden is aan een element in het ng-view
(om een conflict met hoekige $routeProvider
), controleer of de newUrl
heeft requireAuth
eigenschap en opvolgen
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");
}
});
}
]);