Szukam jakiegokolwiek sposobu dostępu do zakresu „nadrzędnego” w ramach dyrektywy. Jakakolwiek kombinacja zakresu, transkluzji, wymagania, przekazywania zmiennych (lub samego zakresu) z góry itp. Jestem całkowicie skłonny pochylić się do tyłu, ale chcę uniknąć czegoś całkowicie zhakowanego lub niemożliwego do utrzymania. Na przykład wiem, że mógłbym to zrobić teraz, pobierając parametry $scope
z PreLink i iterując po swoich $sibling
zakresach, aby znaleźć koncepcyjny „rodzic”.
To, czego naprawdę chcę, to mieć możliwość $watch
wyrażenia w zakresie nadrzędnym. Jeśli mogę to zrobić, to mogę osiągnąć to, co próbuję tutaj zrobić:
AngularJS - Jak renderować częściowy ze zmiennymi?
Ważną uwagą jest to, że dyrektywa musi być ponownie wykorzystywana w tym samym zakresie nadrzędnym. Dlatego domyślne zachowanie (zakres: fałsz) nie działa dla mnie. Potrzebuję indywidualnego zakresu dla każdej instancji dyrektywy, a następnie potrzebuję $watch
zmiennej, która występuje w zakresie nadrzędnym.
Próbka kodu jest warta 1000 słów, więc:
app.directive('watchingMyParentScope', function() {
return {
require: /* ? */,
scope: /* ? */,
transclude: /* ? */,
controller: /* ? */,
compile: function(el,attr,trans) {
// Can I get the $parent from the transclusion function somehow?
return {
pre: function($s, $e, $a, parentControl) {
// Can I get the $parent from the parent controller?
// By setting this.$scope = $scope from within that controller?
// Can I get the $parent from the current $scope?
// Can I pass the $parent scope in as an attribute and define
// it as part of this directive's scope definition?
// What don't I understand about how directives work and
// how their scope is related to their parent?
},
post: function($s, $e, $a, parentControl) {
// Has my situation improved by the time the postLink is called?
}
}
}
};
});
źródło
scope.$watch('localName3', function() { ...[?? WHAT TO DO HERE for example?] });
$parse
z=
: skrzypce .$parse
jest potrzebny tylko w przypadku nieizolowanych zakresów.Dostęp do metody kontrolera oznacza dostęp do metody w zakresie nadrzędnym z dyrektywy kontroler / link / zakres.
Jeśli dyrektywa udostępnia / dziedziczy zakres nadrzędny, wówczas wystarczy wywołać metodę zakresu nadrzędnego.
Niewiele więcej pracy jest wymagane, aby uzyskać dostęp do metody zakresu nadrzędnego z zakresu izolowanej dyrektywy.
Istnieje kilka opcji (może być więcej niż wymienione poniżej), aby wywołać metodę zakresu nadrzędnego z zakresu izolowanych dyrektyw lub obserwować zmienne zakresu nadrzędnego ( specjalnie opcja 6 ).
Zauważ , że użyłem
link function
w tych przykładach, ale możesz również użyć wdirective controller
zależności od wymagań.Opcja 1. Poprzez literał obiektu i z szablonu HTML
index.html
itemfilterTemplate.html
app.js
działający plnkr: http://plnkr.co/edit/rgKUsYGDo9O3tewL6xgr?p=preview
Opcja 2. Poprzez literał obiektu i z linku / zakresu dyrektywy
index.html
itemfilterTemplate.html
app.js
działający plnkr: http://plnkr.co/edit/BRvYm2SpSpBK9uxNIcTa?p=preview
Opcja nr 3. Poprzez odniesienie do funkcji i szablon HTML dyrektywy
index.html
itemfilterTemplate.html
app.js
działający plnkr: http://plnkr.co/edit/Jo6FcYfVXCCg3vH42BIz?p=preview
Opcja nr 4. Poprzez odniesienie do funkcji oraz z linku / zakresu dyrektywy
index.html
itemfilterTemplate.html
app.js
działający plnkr: http://plnkr.co/edit/BSqx2J1yCY86IJwAnQF1?p=preview
Opcja nr 5: Za pomocą modelu ng i powiązania dwukierunkowego można aktualizować zmienne zakresu nadrzędnego. . Dlatego w niektórych przypadkach może nie być konieczne wywołanie funkcji zakresu nadrzędnego.
index.html
itemfilterTemplate.html
app.js
działający plnkr: http://plnkr.co/edit/hNui3xgzdTnfcdzljihY?p=preview
Opcja # 6: Przez
$watch
i$watchCollection
jest wiążąca dwukierunkowoitems
we wszystkich powyższych przykładach, jeśli elementy zostaną zmodyfikowane w zakresie nadrzędnym, elementy w dyrektywie również odzwierciedlą zmiany.Jeśli chcesz oglądać inne atrybuty lub obiekty z zakresu nadrzędnego, możesz to zrobić za pomocą
$watch
i$watchCollection
jak podano poniżejHTML
skrypt app.js
var app = angular.module („plunker”, []);
Zawsze możesz zapoznać się z dokumentacją AngularJs, aby uzyskać szczegółowe wyjaśnienia dotyczące dyrektyw.
źródło
i będziesz miał ten sam zakres (z elementem nadrzędnym)
Istnieje wiele sposobów uzyskania dostępu do zakresu nadrzędnego w zależności od tego zakresu i opcji.
źródło
Oto sztuczka, której użyłem kiedyś: utwórz dyrektywę „obojętną”, aby utrzymać zakres nadrzędny i umieścić go gdzieś poza pożądaną dyrektywą. Coś jak:
i wtedy
Może nie jest to najbardziej wdzięczne rozwiązanie, ale wykonało zadanie.
źródło
Jeśli używasz klas i
ControllerAs
składni ES6 , musisz zrobić coś nieco innego.Zobacz fragment kodu poniżej i zauważ, że
vm
jest toControllerAs
wartość kontrolera nadrzędnego stosowanego w nadrzędnym kodzie HTMLźródło
Po wypróbowaniu wszystkiego w końcu znalazłem rozwiązanie.
Wystarczy umieścić w szablonie następujące elementy:
{{currentDirective.attr = parentDirective.attr; ''}}
Po prostu zapisuje nadrzędny atrybut / zmienną zakresu, do którego chcesz uzyskać dostęp do bieżącego zakresu.
Zwróć także uwagę
; ''
na końcu instrukcji, aby upewnić się, że szablon nie zawiera danych wyjściowych. (Angular ocenia każdą instrukcję, ale wypisuje tylko ostatnią).Jest to trochę zuchwałe, ale po kilku godzinach prób i błędów robi to.
źródło