Angularjs - $rootScope dans la directive fonction de lien
Je pose cette question parce que je ne suis pas tout à fait clair sur la façon de penser de rootscope comme une dépendance adopté des directives
J'ai une directive qui doit afficher des informations à partir de $rootScope ...
Je croyais que je devais passer le $rootScope à une directive, mais quand j'écris une directive comme cela, il semble fonctionner.
.directive("myBar", function () {
return {
restrict: "E",
transclude: true,
replace: true,
template: '<div>' +
'<span ng-transclude></span>' +
'{{rsLabels.welcome}} {{rsUser.firstName}}!' +
'</div>'
}
})
Quand dois-je faire?
.directive("myBar", function ($rootScope) {
return {
restrict: "E",
transclude: true,
replace: true,
template: '<div>' +
'<span ng-transclude></span>' +
'{{rsLabels.welcome}} {{rsUser.firstName}}!' +
'</div>'
}
})
Puis-je et COMMENT puis-je utiliser rootScope si j'en ai besoin dans la fonction de lien de la directive - ou devrais-je le faire dans le contrôleur de la directive?
.directive("myBar", function ($rootScope) {
return {
restrict: "E",
transclude: true,
replace: true,
link: function (scope, element, attrs, rootScope) {
rootScope.rsUser = { firstName: 'Joe' };
rootScope.rsUser = { welcome: 'Welcome' };
},
template: '<div>' +
'<span ng-transclude></span>' +
'{{rsLabels.welcome}} {{rsUser.firstName}}!' +
'</div>'
}
})
Mon rootScope de données est défini en fonction d'exécution
.run(function ($rootScope) {
$rootScope.rsLabels = {
welcome: 'Welcome'
};
$rootScope.rsUser = {
firstName: 'Joe'
};
});
Merci!
Vous devez vous connecter pour publier un commentaire.
À partir de mes expériences, \ l'expérience, il semble que, puisque tous les $étendues finalement hériter de l' $rootScope vous serez en mesure d'accéder à des données sans demander comme un service, suivant la norme javascript prototype de règles d'héritage. Si vous définissez le champ d'application de la propriété dans votre directive faux ou {}, vous trouverez que vous ne pouvez plus y accéder.
Exemple: http://jsbin.com/bequy/1/edit
Vous pouvez le faire de cette façon:
link: function(scope, ...) { scope.$root }
pour accéder à$rootScope
à partir d'une directive.Il est recommandé de ne pas utiliser la racine de la portée pour définir et obtenir les propriétés de votre angulaire de l'application. Essayez d'utiliser le $cacheFactory, car de cette façon, vous pouvez également mettre en cache certaines valeurs sur diverses demandes. ($cacheFactory docs)
Parfois, je dois utiliser $scope.$racine:
En travaillant loin sur cette même question depuis quelques temps, j'ai pensé qu'il était intéressant de noter quelque chose qui a été négligé dans le premier post. Voici mon code d'origine:
À côté de la plus philosophique de la conception à la question de savoir si ou pas, vous devriez utiliser $rootScope à tous, il y a une flagrante mauvaise chose avec mon code ci-dessus que je me sens a été laissé de côté de Mike solution - la référence à $rootScope. Si vous êtes comme moi et que vous avez distincts de votre directive et contrôleur de fichiers, vous aurez besoin de modifier votre code comme suit:
Pourtant, il est encore plus lancinante question: puis-je accomplir le même but sans référencement $rootScope dans la directive? En effet vous pouvez. Vous avez besoin de diffuser de la modification de l' $rootScope propriété de manière efficace permettant à tous les enfants des étendues de savoir le changement et l'observation de ce changement dans la directive.
Contrôleur:
Directive:
Une autre façon est de créer un service et de le jeter que l'accès au service l' $rootScope et d'autres fonctions. J'ai fait comme ça à cause de mon environnement...
Si vous le pouvez, la meilleure façon est Mike solution.
si pas, essayez de ma solution.