Logo AngularJS

Tricks AngularJS – Double ou aucune exécution de contrôleurs

Flattr this!

Alors celle-là, elle a été comique. La situation est simple. Vous avez un contrôleur qui est utilisé dans une vue, comme ceci :

<script>
function monCtrl ($scope) {
}
</script>
<div ng-controller="monCtrl"></div>

Mais cette vue est dynamique puisque vous la chargez grâce au système de routes. Et là dans votre code, vous avez fait ceci :

angular.module('monMod', []).config([
    '$routeProvider',
    function ($routeProvider) {
        $routeProvider.
            when('/main', {
                templateUrl : 'tpl/main.html',
                controller : monCtrl
            })
            otherwise({
                templateUrl : 'tpl/error.html'
            });
    }
]);

Et vous obtenez une superbe double instanciation de votre contrôleur. Virez donc le contrôleur de la route, ça ira tout de suite mieux 😉

Au passage, vous aurez compris que la mise en place de la directive ng-controller est nécessaire à la mise en route naturelle d'un contrôleur. Donc si celui-ci ne s'exécute pas, c'est que vous ne l’appelez pas 😉

Deux en une, vous êtes gâtés.

Flattr this!

A propos de Mathieu

Ingénieur développeur web dans la vente par correspondance B2B, adepte de nouvelles technologies et d'innovation. Vous pouvez aussi me retrouver sur Twitter @mathrobin
Cette entrée a été publiée dans AngularJS, avec comme mot(s)-clef(s) , . Vous pouvez la mettre en favoris avec ce permalien.
  • http://www.yrezgui.com Yacine Rezgui

    Je ne vois pas pourquoi tu utiliserais un ng-controller alors que $routeProvider te génère tout dans ng-view. Tu peux m’expliquer ?

    • http://www.mathieurobin.com/ Mathieu

      Parce que comme tout bon débutant, j’avais introduit mon controller dans mon template via ng-controller. Puis j’ai voulu découper mes vues, donc faire des routes et là la doc indique qu’on peut mettre le controller lié. Ce n’est qu’après coup que j’ai saisi que ça créé une autre instance. Ceci dit, je préfère le mettre dans le template et non dans le routeProvider. Pour la simple raison que je décide où mon controleur démarre si je n’en veux pas sur la globalité de ma vue. Ou quand je souhaite avoir x contrôleurs dans celle-ci, ça n’a pas de sens de tous les déclarer dans le template sauf un

      • http://www.yrezgui.com Yacine Rezgui

        Je préfère déporter le maximum de logique dans mes fichiers JS. Je ne suis pas trop pour l’ajout de logique dans le template. J’arrive à mieux me repérer comme ça.

        PS: Y a-t-il un moyen de s’abonner aux commentaires d’un article sur ton blog, c’est pas très pratique de savoir si tu m’as répondu :/

        • http://www.mathieurobin.com/ Mathieu

          C’est pas de la logique au sens propre du terme. Au contraire, c’est la méthode AngularJS en fait. Ton template est le maître de l’application. Enfin ceci dit seul le temps et l’expérience nous dira si il valait mieux faire comme ça

Articles liés