J'ai une directive qui a son propre contrôleur. Voir le code ci-dessous:
var popdown = angular.module('xModules',[]);
popdown.directive('popdown', function () {
var PopdownController = function ($scope) {
this.scope = $scope;
}
PopdownController.prototype = {
show:function (message, type) {
this.scope.message = message;
this.scope.type = type;
},
hide:function () {
this.scope.message = '';
this.scope.type = '';
}
}
var linkFn = function (scope, lElement, attrs, controller) {
};
return {
controller: PopdownController,
link: linkFn,
replace: true,
templateUrl: './partials/modules/popdown.html'
}
});
Il s'agit d'un système de notification des erreurs / notifications / avertissements. Ce que je veux faire, c'est à partir d'un autre contrôleur (pas de directive) pour appeler la fonction show
sur ce contrôleur. Et quand je fais cela, je voudrais également que ma fonction de lien détecte que certaines propriétés ont changé et exécute certaines animations.
Voici un code pour illustrer ce que je demande:
var app = angular.module('app', ['RestService']);
app.controller('IndexController', function($scope, RestService) {
var result = RestService.query();
if(result.error) {
popdown.notify(error.message, 'error');
}
});
Ainsi, lors de l'appel show
au popdown
contrôleur de directive, la fonction de liaison doit également être déclenchée et effectuer une animation. Comment pourrais-je y parvenir?
javascript
jquery
angularjs
angularjs-directive
user253530
la source
la source
popdown
directive sur la page - est-ce juste à un endroit où les autres contrôleurs sont censés tous y avoir accès, ou y a-t-il plusieurs fenêtres contextuelles à différents endroits?popdown.show(...)
au lieu depopdown.notify(...)
ça, n'est-ce pas? Sinon, la fonction de notification est un peu déroutante.popdown.notify
?.notifiy
méthode, je veux direRéponses:
C'est une question intéressante, et j'ai commencé à réfléchir à la manière dont je mettrais en œuvre quelque chose comme ça.
Je suis venu avec ceci (violon) ;
Fondamentalement, au lieu d'essayer d'appeler une directive à partir d'un contrôleur, j'ai créé un module pour héberger toute la logique de popdown:
J'ai mis deux choses dans le module, une
factory
pour l'API qui peut être injectée n'importe où, et ladirective
pour définir le comportement de l'élément popdown réel:L'usine définit seulement quelques fonctions
success
eterror
et assure le suivi d'un couple de variables:La directive obtient l'API injectée dans son contrôleur et surveille les modifications de l'API (j'utilise bootstrap css pour plus de commodité):
Ensuite, je définis un
app
module qui dépend dePopdown
:Et le HTML ressemble à:
Je ne suis pas sûr que ce soit complètement idéal, mais cela semblait être un moyen raisonnable de mettre en place une communication avec une directive popdown globale.
Encore une fois, pour référence, le violon .
la source
success(msg)
le code html, vous appelleriezsucess(name, msg)
pour sélectionner la directive avec le nom correct.Vous pouvez également utiliser des événements pour déclencher le Popdown.
Voici un violon basé sur la solution de Satchmorun. Il se dispense de PopdownAPI, et du contrôleur de niveau supérieur à la place,
$broadcast
les événements de `` succès '' et `` erreur '' le long de la chaîne de portée:Le module Popdown enregistre ensuite les fonctions du gestionnaire pour ces événements, par exemple:
Cela fonctionne, au moins, et me semble être une solution bien découplée. Je laisserai les autres intervenir si cela est considéré comme une mauvaise pratique pour une raison quelconque.
la source
Vous pouvez également exposer le contrôleur de la directive à la portée parent, comme le fait
ngForm
avec l'name
attribut: http://docs.angularjs.org/api/ng.directive:ngFormVous pouvez trouver ici un exemple très basique de la manière dont cela pourrait être réalisé http://plnkr.co/edit/Ps8OXrfpnePFvvdFgYJf?p=preview
Dans cet exemple, j'ai
myDirective
avec un contrôleur dédié avec une$clear
méthode (sorte d'API publique très simple pour la directive). Je peux publier ce contrôleur dans la portée parent et utiliser appeler cette méthode en dehors de la directive.la source
$scope.$parent[alias]
parce que ça sent pour moi d'utiliser une API angulaire interne. Mais je ne trouve toujours pas de solution plus élégante pour les directives not-singleton. D'autres variantes comme la diffusion d'événements ou la définition d'un objet vide dans le contrôleur parent pour une API directive sent encore plus.J'ai une bien meilleure solution.
voici ma directive, j'ai injecté sur la référence d'objet dans la directive et je l'ai étendue en ajoutant la fonction invoke dans le code directive.
Déclarer la directive dans le HTML avec un paramètre:
mon contrôleur:
la source