Mam dyrektywę, która ma własnego kontrolera. Zobacz poniższy kod:
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'
}
});
Ma to być system powiadamiania o błędach / powiadomieniach / ostrzeżeniach. To, co chcę zrobić, to wywołać funkcję show
na tym kontrolerze z innego kontrolera (nie dyrektywy) . A kiedy to zrobię, chciałbym również, aby moja funkcja łączenia wykryła, że niektóre właściwości uległy zmianie i wykonała pewne animacje.
Oto kod ilustrujący to, o co proszę:
var app = angular.module('app', ['RestService']);
app.controller('IndexController', function($scope, RestService) {
var result = RestService.query();
if(result.error) {
popdown.notify(error.message, 'error');
}
});
Więc kiedy dzwoni show
na popdown
dyrektywy kontrolera, funkcja link powinien również być wyzwalane i wykonać animację. Jak mogłem to osiągnąć?
javascript
jquery
angularjs
angularjs-directive
user253530
źródło
źródło
popdown
dyrektywy na stronie - czy jest to tylko w jednym miejscu, do którego mają mieć dostęp wszyscy kontrolerzy, czy też jest kilka wyskakujących okienek w różnych miejscach?popdown.show(...)
zamiast tego chciałeś napisać,popdown.notify(...)
czy to prawda? W przeciwnym razie funkcja powiadamiania jest nieco myląca.popdown.notify
?.notifiy
metoda, mam na myśliOdpowiedzi:
To ciekawe pytanie i zacząłem się zastanawiać, jak zrealizowałbym coś takiego.
Wymyśliłem to (skrzypce) ;
Zasadniczo, zamiast próbować wywołać dyrektywę ze sterownika, stworzyłem moduł mieszczący całą logikę wyskakującą:
Umieściłem w module dwie rzeczy, a
factory
dla interfejsu API, które można wstrzyknąć w dowolnym miejscu, orazdirective
dla zdefiniowania zachowania rzeczywistego elementu popdown:Fabryka właśnie definiuje kilka funkcji
success
ierror
i śledzi kilka zmiennych:Dyrektywa wprowadza API do kontrolera i obserwuje interfejs API pod kątem zmian (dla wygody używam bootstrap css):
Następnie definiuję
app
moduł, który zależy odPopdown
:A kod HTML wygląda następująco:
Nie jestem pewien, czy jest to całkowicie idealne, ale wydawało się, że jest to rozsądny sposób na skonfigurowanie komunikacji z globalną dyrektywą popdown.
Ponownie, dla odniesienia, skrzypce .
źródło
success(msg)
kod HTML, powinieneś wywołać,sucess(name, msg)
aby wybrać dyrektywę o poprawnej nazwie.Możesz także użyć zdarzeń, aby wywołać Popdown.
Oto skrzypce oparte na rozwiązaniu Satchmorun. Eliminuje PopdownAPI, a kontroler najwyższego poziomu zamiast
$broadcast
zdarzeń „sukcesu” i „błędu” w łańcuchu zasięgu:Następnie moduł Popdown rejestruje funkcje obsługi dla tych zdarzeń, np .:
To przynajmniej działa i wydaje mi się, że jest to ładnie oddzielone rozwiązanie. Pozwolę innym się wtrącić, jeśli z jakiegoś powodu zostanie to uznane za złą praktykę.
źródło
Możesz również ujawnić kontroler dyrektywy w zakresie nadrzędnym, tak jak w
ngForm
przypadkuname
atrybutu: http://docs.angularjs.org/api/ng.directive:ngFormTutaj możesz znaleźć bardzo podstawowy przykład, jak można to osiągnąć http://plnkr.co/edit/Ps8OXrfpnePFvvdFgYJf?p=preview
W tym przykładzie mam
myDirective
dedykowany kontroler z$clear
metodą (rodzaj bardzo prostego publicznego API dla dyrektywy). Mogę opublikować ten kontroler w zakresie nadrzędnym i wywołać tę metodę poza dyrektywą.źródło
$scope.$parent[alias]
ponieważ pachnie jak używanie wewnętrznego kątowego interfejsu API. Ale nadal nie mogę znaleźć bardziej eleganckiego rozwiązania dla dyrektyw innych niż pojedyncze. Inne warianty, takie jak nadawanie zdarzeń lub definiowanie pustego obiektu w kontrolerze nadrzędnym dla dyrektywy API, pachną jeszcze bardziej.Mam dużo lepsze rozwiązanie.
oto moja dyrektywa, wstrzyknąłem odwołanie do obiektu w dyrektywie i rozszerzyłem to, dodając funkcję invoke w kodzie dyrektywy.
Deklaracja dyrektywy w kodzie HTML z parametrem:
mój kontroler:
źródło