J'ai besoin d'effectuer certaines opérations sur la portée et le modèle. Il semble que je puisse le faire dans la link
fonction ou dans la controller
fonction (car les deux ont accès à la portée).
Quand est-ce le cas lorsque je dois utiliser la link
fonction et non le contrôleur?
angular.module('myApp').directive('abc', function($timeout) {
return {
restrict: 'EA',
replace: true,
transclude: true,
scope: true,
link: function(scope, elem, attr) { /* link function */ },
controller: function($scope, $element) { /* controller function */ }
};
}
Aussi, je comprends que link
c'est le monde non angulaire. Donc, je peux utiliser $watch
, $digest
et $apply
.
Quelle est la signification de la link
fonction, alors que nous avions déjà un contrôleur?
javascript
angularjs
angularjs-directive
Yugal Jindle
la source
la source
$watch
,$digest
et$apply
. "?link
nous ne voyons aucune magie angulaire. c'est-à-dire pas de liaisons à 2 voies, etc. Juste que nous avons l'api de l'angulaire disponible.Réponses:
Après ma première lutte avec les
link
etcontroller
fonctions et en lisant beaucoup de choses sur eux, je pense que maintenant j'ai la réponse.Tout d' abord permet de comprendre ,
Comment fonctionnent les directives angulaires en bref:
Nous commençons par un modèle (sous forme de chaîne ou chargé dans une chaîne)
var templateString = '<div my-directive>{{5 + 10}}</div>';
Maintenant,
templateString
c'est enveloppé comme un élément angulairevar el = angular.element(templateString);
Avec
el
, maintenant nous le compilons avec$compile
pour récupérer la fonction de lien .var l = $compile(el)
Voici ce qui se passe,
$compile
parcourt tout le modèle et recueille toutes les directives qu'il reconnaît.link
fonctions sont collectées.link
fonctions sont enveloppées dans une nouvellelink
fonction et renvoyées sous la formel
.Enfin, nous fournissons une
scope
fonction à cette fonctionl
(lien) qui exécute en outre les fonctions de lien encapsulées avec celle-ciscope
et leurs éléments correspondants.l(scope)
Cela ajoute le en
template
tant que nouveau nœud auDOM
et appellecontroller
ce qui ajoute ses montres à la portée qui est partagée avec le modèle dans DOM.En comparant la compilation vs lien vs contrôleur :
Chaque directive n'est compilée qu'une seule fois et la fonction de liaison est conservée pour être réutilisée. Par conséquent, s'il y a quelque chose qui s'applique à toutes les instances d'une directive, celle-ci doit être effectuée à l'intérieur de la
compile
fonction de la directive .Maintenant, après la compilation, nous avons une
link
fonction qui est exécutée tout en attachant le modèle au DOM . Nous effectuons donc tout ce qui est spécifique à chaque instance de la directive. Par exemple: attacher des événements , muter le modèle en fonction de la portée , etc.Enfin, le contrôleur est censé être disponible pour être en direct et réactif pendant que la directive fonctionne sur le
DOM
(après avoir été attaché). Par conséquent:(1) Après avoir configuré la vue [ V ] (ie modèle) avec lien.
$scope
est notre [ M ] et$controller
est notre [ C ] dans MVC(2) Profitez de la liaison bidirectionnelle avec $ scope en configurant des montres.
(3) les
$scope
montres devraient être ajoutées dans le contrôleur, car c'est ce qui regarde le modèle pendant l'exécution.(4) Enfin,
controller
est également utilisé pour pouvoir communiquer entre les directives connexes. (CommemyTabs
exemple dans https://docs.angularjs.org/guide/directive )(5) Il est vrai que nous aurions pu faire tout cela aussi dans la
link
fonction, mais c'est une question de séparation des préoccupations .Par conséquent, nous avons enfin les éléments suivants qui s'adaptent parfaitement à toutes les pièces:
la source
Pourquoi les contrôleurs sont nécessaires
La différence entre
link
etcontroller
entre en jeu lorsque vous souhaitez imbriquer des directives dans votre DOM et exposer les fonctions API de la directive parent aux directives imbriquées.De la documentation :
Disons que vous voulez avoir deux directives
my-form
etmy-text-input
que vous voulez que lamy-text-input
directive n'apparaisse qu'à l'intérieurmy-form
et nulle part ailleurs.Dans ce cas, vous direz lors de la définition de la directive
my-text-input
qu'elle requiert un contrôleur de l'parent
élément DOM en utilisant l'argument de besoin, comme ceci:require: '^myForm'
. Maintenant, le contrôleur de l'élément parent serainjected
dans lalink
fonction comme quatrième argument suivant$scope, element, attributes
. Vous pouvez appeler des fonctions sur ce contrôleur et communiquer avec la directive parent.De plus, si un tel contrôleur n'est pas trouvé, une erreur sera générée.
Pourquoi utiliser le lien
Il n'y a pas vraiment besoin d'utiliser la
link
fonction si l'on définit lecontroller
puisque le$scope
est disponible sur lecontroller
. De plus, tout en définissant à la foislink
etcontroller
, il faut faire attention à l'ordre d'invocation des deux (controller
est exécuté avant).Cependant, conformément à la méthode angulaire , la plupart des manipulations DOM et de la liaison bidirectionnelle
$watchers
sont généralement effectuées dans lalink
fonction tandis que l'API pour les enfants et la$scope
manipulation sont effectuées dans lecontroller
. Ce n'est pas une règle stricte et rapide, mais cela rendra le code plus modulaire et aidera à séparer les préoccupations (le contrôleur maintiendra l'directive
état et lalink
fonction conservera lesDOM
liaisons + externes).la source
link
?controller
? Pourquoi vais-je vouloir inventer une toute nouvelle fonction juste pour éviter de définir un contrôleur?La
controller
fonction / objet représente un contrôleur de vue de modèle d'abstraction (MVC). Bien qu'il n'y ait rien de nouveau à écrire sur MVC, c'est toujours le plus grand avantage d'angular: diviser les préoccupations en plus petits morceaux. Et voilà, rien de plus, donc si vous devez réagir sur lesModel
changements à venir deView
l'Controller
est la bonne personne pour faire ce travail.L'histoire de la
link
fonction est différente, elle vient d'une perspective différente de celle de MVC. Et c'est vraiment essentiel, une fois qu'on veut franchir les frontières d'uncontroller/model/view
(modèle) .Commençons par les paramètres passés dans la
link
fonction:Pour mettre le
link
dans le contexte, nous devons mentionner que toutes les directives passent par ces étapes du processus d'initialisation: Compiler , Lier . Un extrait de Brad Green et Shyam Seshadri livre Angular JS :Phase de compilation (sœur du lien, mentionnons-la ici pour avoir une image claire):
Dans cette phase, Angular parcourt le DOM pour identifier toutes les directives enregistrées dans le modèle. Pour chaque directive, il transforme ensuite le DOM en fonction des règles de la directive (modèle, remplacer, transclure, etc.) et appelle la fonction de compilation si elle existe. Le résultat est une fonction de modèle compilée,
Phase de liaison :
Un bel exemple comment utiliser le
link
pourrait être trouvé ici: Création de directives personnalisées . Voir l'exemple: Création d'une directive qui manipule le DOM , qui insère une "date-heure" dans la page, actualisée toutes les secondes.Juste un extrait très court de cette riche source ci-dessus, montrant la vraie manipulation avec DOM. Il y a une fonction accrochée au service $ timeout, et elle est également effacée dans son appel de destructeur pour éviter les fuites de mémoire
la source
compiler
etlink
. Ils se demandent pourquoilink
alors que nous avions déjàcontroller
controller
vslink
devraient être plus clairs ...link
ou aucontroller
.controller
etlink
est relativement moche. Donc, l'équipe angulaire doit avoir une bonne raison au lieu d'une simple option.