Premiers pas avec angular-ui-router

Hello World Exemple

ÉTAPE 1 : Installation

Avant de pouvoir utiliser Angular-UI Router, vous devez inclure AngularJS lui-même dans votre projet. Pour un guide détaillé à ce sujet, consultez cette [documentation][1].

Vous pouvez télécharger Angular-UI Router soit depuis leur [GitHub-Page][2] ou depuis NuGet, NPM, Bower respectivement.

Après avoir inclus le fichier JS dans votre page Web, vous pouvez injecter le module ui.router dans votre application. Dans votre fichier de script, vous devriez avoir quelque chose comme ceci :

var app = angular.module('app', []);

et maintenant nous allons injecter Angular-UI Router dans notre propre application comme ceci :

var app = angular.module('app', ['ui.router']);

Maintenant, Angular-UI Router sera chargé avec notre application. Les étapes suivantes expliqueront les bases du routeur Angular-UI et montreront certaines des fonctionnalités de base.


ÉTAPE 2 : Définir des états simples

Vous pouvez configurer l’UI-Router dans la fonction “config” d’Angular. Utilisez le $stateProvider pour définir vos états. Dans l’exemple suivant, chaque état a une URL, un contrôleur et un modèle.

(function() {
  var app = angular.module('app', ['ui.router']);
  
  app.config(['$stateProvider', function($stateProvider) {
      $stateProvider
        .state('home', {
          url: "/home",
          templateUrl: "home.html",
          controller: "homeCtrl"
        })
        .state('kitchen', {
          url: "/kitchen",
          templateUrl: "kitchen.html",
          controller: "kitchenCtrl"
        })
        .state('den', {
          url: "/denCtrl",
          templateUrl: "den.html",
          controller: "denCtrl"
        })
        .state('itemDetail', {
          url: "/items/:itemName",
          templateUrl: "item.html",
          controller: "itemDetailCtrl"
        })

    }])
})();

dans votre HTML, vous aurez besoin de la directive ui-view pour que les vues d’état puissent être renseignées à l’intérieur.

<div ui-view></div>

ÉTAPE 3 : Accéder aux états

Il existe en tout 3 façons d’accéder à un état défini dans $stateProvider.

1. Via la directive ui-sref

Vous pouvez accéder aux états à l’intérieur de votre HTML, en utilisant la directive ui-sref

<li ui-sref-active="active">
    <a ui-sref="kitchen">Go to the Kitchen</a>
</li>
<li ui-sref-active="active">
    <a ui-sref="den">Enter the den</a>
</li>
<li ui-sref-active="active">
    <a ui-sref="itemDetail({itemName:'keyboard'})">Key Board</a>
</li>

2. Via le service $state dans le contrôleur

vous pouvez également naviguer vers d’autres états à l’intérieur de votre contrôleur en utilisant le $state fourni au contrôleur avec la méthode .go.

.controller(function($scope, $state) {
    // ...
    $scope.navigateTo = function(stateName) {
        $state.go(stateName); // i.e. $state.go('den'); 
    };
})

3. Via l’url dans le navigateur

En supposant que vous ayez un état appelé “cuisine” défini comme ceci :

$stateProvider
  .state("kitchen", {
    url: "/kitchenUrl",
    ...
  });

Ensuite, accéder à appdomain/kitchenUrl en tant qu’URL dans votre navigateur ira à votre état “cuisine”, en supposant qu’il n’y a pas d’états imbriqués et que “appdomain” est le serveur qui héberge votre application.

Si vous êtes toujours confus, voici un [Plnkr][3] entièrement fonctionnel

[1] : https://www.wikiod.com/fr/angularjs/premiers-pas-avec-angularjs#Commencer [2] : https://github.com/angular-ui/ui-router [3] : http://plnkr.co/edit/y67KK9gZ5NdIMbMrBF6s?p=preview//

Vue de base

index.html

<html>
    <head>
        <title>Angular-UI Router Example</title>
        <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.9/angular.js"></script>
        <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.3.1/angular-ui-router.js"></script>
        <script type="text/javascript" src="../js/script.js"></script>
    </head>
    <body ui-view="mainView"> <!-- Defining a container for our view -->
    </body>
</html>

script.js

var app = angular.module('app', ['ui.router']);
app.config(['$stateProvider', function($stateProvider){
    $stateProvider.state('home', {                        // Creating a state called 'home'
        url: '',                                          // An empty URL means that this state will be loaded on the main URL when no other state is called
        views: {
            'mainView': {                                 // Section for our view-container that we defined in the HTML
                template: '<h1>It works!</h1>'            // Setting a template for this view
                /*templateUrl: '../templates/home.html'*/ //templateUrl would load the file and uses it's content as the template
             }
        }
    });
}])

Définir un état avec plusieurs vues

Dans ui-router, un état peut contenir plusieurs vues, chacune avec son propre contrôleur et un modèle

.state('dashboard', {
     name: 'dashboard',
     url: '/dashboard',
     views: {
         "view1": {
             templateUrl: "path/to/view1.html",
             controller: "view1Controller"
         },
         "view2": {
             templateUrl: "path/to/view2.html",
             controller: "view2Controller"
         }
     }
 })

Ensuite, dans le code HTML de votre état, vous pouvez lier ces vues

<div ui-view="view1"></div>
<div ui-view="view2"></div>

Résoudre les données dans un état

Vous pouvez “résoudre” les données dans votre état lorsque vous y faites la transition, généralement c’est utile lorsque l’état doit utiliser ces données, ou pour se résoudre dans un état lorsque certaines entrées fournies doivent être authentifiées.

Lorsque vous définissez vos états, vous devrez fournir une carte des valeurs à résoudre dans la propriété .resolve, chaque valeur résolue doit avoir une fonction qui renvoie une promesse

.state('main', {
     url: "/main",
     templateUrl: "path/to/main.html",
     controller: 'mainCtrl',
     resolve: {
         serverData: function ($http) {
             return $http.get('some/url');
         }
     }
});

Maintenant, à l’intérieur de mainCtrl, vous pouvez accéder aux données (c’est-à-dire si l’appel $http a été résolu avec succès).

.controller("mainCtrl", function($scope, serverData) {
    $scope.resolvedData = serverData.then(resp=> resp.data);
    ....
})

Utiliser les événements de transition

UI-Router expose des événements de transition qui peuvent être utiles pour gérer les erreurs de transition, gérer/bloquer les transitions en fonction de certaines valeurs de paramètres, authentification personnalisée, etc.

Ces événements peuvent être liés à $rootScope pour un effet global ou à $scope pour un effet par contrôleur.


$stateChangeError - Cet événement est diffusé lorsqu’une tentative de changement d’état a échoué et a généré une erreur, cet événement déclenche une fonction de rappel avec la signature suivante :

rappel (événement, toState, toParams, fromState, fromParams, erreur)

événement : l’objet événement

toState : l’état cible

toParams : les paramètres passés à l’état cible

fromState : état actuel

fromParams : les paramètres passés à l’état actuel

error : l’objet d’erreur


$stateChangeStart - Cet événement est diffusé lorsqu’une transition d’état a commencé, cet événement déclenche une fonction de rappel avec la signature suivante :

rappel (événement, toState, toParams, fromState, fromParams, options)

options : l’objet d’options d’état

$stateChangeSuccess - Cet événement est diffusé lorsqu’une transition d’état se termine, cet événement déclenche une fonction de rappel avec la signature suivante :

rappel (événement, toState, toParams, fromState, fromParams, options)


$stateNotFound - Cet événement est diffusé lorsqu’un état vers lequel vous avez demandé la transition n’a pas été trouvé, cet événement déclenche une fonction de rappel avec la signature suivante :

rappel (événement, unfoundState, fromParams, fromState)

unfoundState - un objet représentant l’état qui n’a pas été trouvé


Exemple:

$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams, options) {
    $log.debug("$stateChangeSuccess: event: %o toState: %o, toParams: %o, fromState: %o, fromParams: %o, options: %o", event, toState, toParams, fromState, fromParams, options);
    // runs when the state has successfully changed
});

$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams, options) {
    $log.debug("$stateChangeStart: event: %o toState: %o, toParams: %o, fromState: %o, fromParams: %o, options: %o", event, toState, toParams, fromState, fromParams, options);
    // runs when the state has just started to transition
});

$rootScope.$on('$stateNotFound', function (event, unfoundState, fromParams, fromState) {
    $log.debug("$stateNotFound: event: %o unfoundState: %o, fromParams: %o, fromState: %o", event, unfoundState, fromParams, fromState);
    // runs when the state wsa not found
});

$rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
    $log.debug("$stateChangeError: event: %o toState: %o, toParams: %o, fromState: %o, fromParams: %o, error: %o", event, toState, toParams, fromState, fromParams, error);
    // runs when there was an error while attempting to transition
});