@Josh wspomniano w swojej odpowiedzi, że
Najlepszym rozwiązaniem, ponieważ swoimi directiveB
-jak komponentów oczekuje się zużyć w ciągu directiveA
składników jest użycie require
.
byłem bawiąc się tym i uważam, że kontroler na directiveA
jest tylko rozwiązaniem (tak +1 Josh). Oto co zakresy wyglądać użyciu PO za skrzypce (. Odwrócić brązową strzałkę i masz $$ previousSibling zamiast $$ nextSibling)
Inne niż $$previousSibling
, zakres 004 ma ścieżki do izolacji zakres 003.Zauważ, że zasięg 004 jest zasięgiem transcluded, który tworzy directiveA
, a ponieważ directiveB
nie tworzy nowego zakresu, ten zakres jest również używany przez directiveB
.
Ponieważ obiekt, który chcesz udostępnić z directiveB
, jest tworzony w kontrolerze directiveA
, nie możemy również używać atrybutów do udostępniania danych między dyrektywami.
Tworzenie modelu wewnątrz dyrektywy, a następnie udostępnianie tego modelu na zewnątrz jest raczej nietypowe. Zwykle będziesz chciał zdefiniować swoje modele poza swoimi dyrektywami, a nawet poza swoimi kontrolerami (listen for a few minutes to Misko). Usługi są często dobrym miejscem do przechowywania modeli/danych. Kontrolery powinny zazwyczaj odwoływać się do części modeli, które muszą być rzutowane na widok, z którym są powiązane.
Dla uproszczenia, zamierzam zdefiniować model na kontrolerze, wtedy dyrektywy będą miały dostęp do tego modelu w normalny sposób. Dla celów pedagogicznych, directiveA
nadal będzie używać zakresu izolowania, a directiveB
utworzy nowy zakres podrzędny, używając scope: new
, jak w odpowiedzi @ Josha. Ale każdy typ (izoluj, nowe dziecko, bez nowego zakresu) i kombinacja będą działać, teraz, gdy mamy model zdefiniowany w zakresie nadrzędnym.
Ctrl:
$scope.model = {value: '#33ff33', checkedState = true};
HTML:
<div ng-controller="NoTouchPrevSibling">
<div data-directive-a data-value="model.value" data-checked="model.checkedState">
<div data-directive-b></div>
</div>
Z innych powodów pedagogicznych, zdecydowałem się przejść dyrektywyświadectwo dwie cechy modela jako oddzielne atrybuty, ale cały model/obiekt mógł również zostać przekazany. Ponieważ dyrektywa B tworzy zakres podrzędny, nie musi przekazywać żadnych atrybutów, ponieważ ma dostęp do wszystkich właściwości zakresu nadrzędnego/kontrolera.
Dyrektywy:
app.directive('directiveA', function() {
return {
template: '<div>'
+ 'inside parent directive: {{checkedState}}'
+ '<input type="checkbox" ng-model="checkedState" />'
+ '<div ng-transclude></div>'
+ '</div>',
transclude: true,
replace: true,
scope: {
value: '=',
checkedState: '=checked'
},
};
});
app.directive('directiveB', function() {
return {
template: '<div>'
+ '<span>inside transcluded directive: {{model.checkedState}}</span>'
+ '<input type="text" ng-model="model.value" />'
+ '</div>',
replace: true,
scope: true
};
});
Celownik:
pamiętać, że zakres dziecko directiveB użytkownika (006) dziedziczy dołączany zakresie dyrektywyświadectwo'S (005).
Po kliknięciu na pole i zmieniając wartość w polu tekstowym:
Zauważ, że kątowe uchwyty aktualizację izolować właściwości zakresu. Normalny JavaScript prototypal inheritance zapewnia zakresowi dziecinnemu dyrektywy B dostęp do model
w zasięgu kontrolera (003).
Fiddle
polecam korzystania wymaga definicji w dyrektywie i przekazać do kontrolera nadrzędnego kontrolera dziecięcej –
Dlaczego te wytyczne w ogóle rozważają oni nic nie robić? Jeśli są one tylko ilustracją problemu, czy te dyrektywy * zawsze * byłyby używane razem lub mogłyby być potencjalnie używane osobno?Czy chcesz, aby dyrektywa B była translatowana zawsze w odniesieniu do zakresu dyrektywyA zamiast nowego dziecka rodzica? Dlaczego dyrektywa A ma zasięg izolowania, ale dyrektywa B w ogóle nie deklaruje nowego zakresu? –
@JoshDavidMiller Dodałem nieco więcej głębi do powyższego opisu. W odniesieniu do żadnego zadeklarowanego zakresu na 'B' i zakresu izolatu na' A' - nie mam tego skonfigurowanego w ten sposób z jakiegokolwiek powodu w szczególności. Wiem tylko, że muszę przekazać pewne dane z DOM do dyrektywy (dyrektyw), a najlepszym sposobem wydaje się być 'scope: {xxx: '@'}' – jlb