Il existe deux modèles utilisés pour accéder aux fonctions du contrôleur: this
et $scope
.
Que dois-je utiliser et quand? Je comprends this
est défini sur le contrôleur et $scope
est un objet dans la chaîne de portée pour les vues. Mais avec la nouvelle syntaxe "Controller as Var", vous pouvez facilement utiliser l'une ou l'autre. Alors ce que je demande, c'est ce qui est le mieux et quelle est la direction pour l'avenir?
Exemple:
En utilisant
this
function UserCtrl() { this.bye = function() { alert('....'); }; }
<body ng-controller='UserCtrl as uCtrl'> <button ng-click='uCtrl.bye()'>bye</button>
En utilisant
$scope
function UserCtrl($scope) { $scope.bye = function () { alert('....'); }; }
<body ng-controller='UserCtrl'> <button ng-click='bye()'>bye</button>
Personnellement, je trouve this.name
cela plus agréable à l'œil et plus naturel par rapport aux autres modèles Javascript OO.
Des conseils s'il vous plait?
Réponses:
Les deux ont leur utilité. Tout d'abord, un peu d'histoire ...
$ scope est la technique "classique" tandis que "controller as" est beaucoup plus récent (à partir de la version 1.2.0 officiellement bien qu'il apparaissait dans les pré-versions instables avant cela).
Les deux fonctionnent parfaitement bien et la seule mauvaise réponse est de les mélanger dans la même application sans raison explicite. Franchement, les mélanger fonctionnera, mais cela ne fera qu'ajouter à la confusion. Alors choisissez-en un et roulez avec. La chose la plus importante est d'être cohérent.
Laquelle? Cela dépend de vous. Il existe de nombreux autres exemples de $ scope, mais "controller as" prend également de l'ampleur. Est-ce que l'un est meilleur que l'autre? C'est discutable. Alors, comment choisissez-vous?
Confort
Je préfère le "contrôleur en tant que" car j'aime cacher la portée $ et exposer les membres du contrôleur à la vue via un objet intermédiaire. En définissant ceci. *, Je peux exposer exactement ce que je veux exposer du contrôleur à la vue. Vous pouvez le faire avec $ scope aussi, je préfère simplement utiliser JavaScript standard pour cela. En fait, je le code comme ceci:
Cela me semble plus propre et permet de voir facilement ce qui est exposé à la vue. Remarquez que je nomme la variable que je renvoie "vm", qui signifie viewmodel. C'est juste ma convention.
Avec $ scope, je peux faire les mêmes choses, donc je n'ajoute ni n'altère la technique.
Donc, c'est à vous là-bas.
Injection
Avec $ scope, j'ai besoin d'injecter $ scope dans le contrôleur. Je n'ai pas à le faire avec le contrôleur car, sauf si j'en ai besoin pour une autre raison (comme $ broadcast ou montres, bien que j'essaie d'éviter les montres dans le contrôleur).
MISE À JOUR J'ai écrit cet article sur les 2 choix: http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/
la source
var vm = this;
devez-vous également l'appeler "vm" dans la vue? 'contrôleur en tant que vm'. Doivent-ils être les mêmes?$scope
est en cours de suppression dans Angular 2.0. Ainsi, l'utilisationthis
serait une approche que d'autres voudraient suivre à mesure que la date de sortie d'Angular 2.0 se rapproche.la source
Mon opinion est que «ceci» en javascript a suffisamment de problèmes en soi, et que l'ajout d'une autre signification / utilisation n'est pas une bonne idée.
J'utiliserais $ scope, par souci de clarté.
METTRE À JOUR
Il y a maintenant la syntaxe «contrôleur en tant que», discutée ici . Je ne suis pas fan, mais maintenant que c'est une construction AngularJS plus «officielle», elle mérite une certaine attention.
la source
Je pense que Controller As est meilleur car il permet d'imbriquer plus facilement les étendues décrites par Todd Motto ici:
http://toddmotto.com/digging-into-angulars-controller-as-syntax/
De plus, cela vous assurera d'en avoir toujours au moins un. dans votre expression de liaison qui vous oblige à suivre la recommandation de ne pas vous lier aux primitives .
De plus, vous pouvez vous dissocier de la portée qui disparaît dans 2.0.
la source
La documentation Angular vous indique explicitement que l'utilisation
this
est recommandée. Cela, en plus du fait qu'il$scope
est supprimé, est une raison suffisante pour que je ne l'utilise jamais$scope
.la source
"La portée de $ de jason328 est supprimée dans Angular 2.0" me semble être une bonne raison. Et j'ai trouvé une autre raison pour m'aider à faire le choix:
this
est plus lisible - quand je voisfooCtrl.bar
en HTML, je sais immédiatement où trouver la définition debar
.Mises à jour: peu de temps après le passage à la
this
solution, j'ai commencé à manquer un$scope
moyen qui nécessite moins de frappela source
Je préfère une combinaison.
Un simple console.log de $ scope et «ceci» après les avoir remplis avec des données factices vous le montrera.
$ scope permet d'accéder aux parties sous les couvertures d'un contrôleur, par exemple:
** Les propriétés et les méthodes avec $$ ne sont pas recommandées par l'équipe Angular, mais le $ peut être un jeu sûr pour faire des trucs sympas avec $ parent et $ id.
'ceci' va droit au but, en attachant des données et des fonctions à double sens. Vous ne verrez que ce que vous avez joint:
Alors pourquoi je préfère une combinaison?
Dans les applications imbriquées ui-router, je peux accéder au contrôleur principal, définir et appeler des valeurs et des fonctions universelles à l'intérieur d'un contrôleur enfant:
Dans le contrôleur principal:
Dans le contrôleur enfant:
Maintenant, vous pouvez accéder au parent de l'enfant et à l'enfant du parent!
la source
Les deux fonctionnent, mais si vous appliquez des éléments appropriés pour l'étendue à $ scope, et si vous appliquez des éléments appropriés pour le contrôleur au contrôleur, votre code sera facile à maintenir. Aux personnes qui disent "Ugh, utilisez simplement la portée, oubliez ce contrôleur comme syntaxe" ... Cela peut fonctionner de la même manière, mais je me demande comment vous pourrez maintenir une énorme application sans perdre la trace des choses.
la source