@Josh menzionato nella sua risposta che
La soluzione migliore in quanto i tuoi directiveB
-come componenti dovrebbero essere utilizzati entro directiveA
componenti è quello di utilizzare require
.
ho accarezzato con questo e credo che un controllore sulla directiveA
è l'unica soluzione (così +1 Josh). Ecco cosa gli scopi simile utilizzando violino del PO: (. Reverse la freccia marrone e si dispone di $$ previousSibling invece di $$ nextSibling)
Oltre $$previousSibling
, portata 004 non ha alcun percorso di isolare scope 003.Notare che l'ambito 004 è l'ambito transcluso creato da directiveA
e dal momento che directiveB
non crea un nuovo ambito, questo ambito viene anche utilizzato da directiveB
.
Poiché l'oggetto che si desidera condividere con directiveB
viene creato nel controller directiveA
, non è possibile utilizzare gli attributi per condividere i dati tra le direttive.
Creare un modello all'interno di una direttiva e quindi condividerlo con il mondo esterno è piuttosto atipico. Normalmente, ti consigliamo di definire i tuoi modelli al di fuori delle tue direttive e anche al di fuori dei tuoi controller (listen for a few minutes to Misko). I servizi sono spesso un buon posto per memorizzare i tuoi modelli/dati. I controllori dovrebbero normalmente fare riferimento alle parti del/i modello/i che devono essere proiettate nella vista a cui sono associate.
Per semplicità, ho intenzione di definire il modello su un controller, quindi le direttive accederanno entrambi a questo modello nel modo normale. Per scopi pedagogici, directiveA
utilizzerà comunque un ambito isolato e directiveB
creerà un nuovo ambito figlio utilizzando scope: new
come nella risposta di @ Josh. Ma qualsiasi tipo (isolare, nuovo figlio, nessun nuovo ambito) e la combinazione funzioneranno, ora che abbiamo il modello definito in un ambito genitore.
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>
Per altri motivi pedagogici, ho optato per passare directiveA le due proprietà modello come attributi separati, ma la anche l'intero modello/oggetto poteva essere passato. Poiché direttivaB creerà un ambito secondario, non è necessario passare alcun attributo poiché ha accesso a tutte le proprietà dell'ambito padre/controllore.
direttive:
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
};
});
Mirini:
Si noti che la portata del bambino directiveB (006) eredita da portata transclusa di directiveA (005).
Dopo aver fatto clic sulla casella di controllo e modificando il valore nella casella di testo:
Si noti che le maniglie angolari aggiornamento delle proprietà dell'ambito isolare. Normale JavaScript prototypal inheritance fornisce l'accesso child scope della direttiva B allo model
nell'ambito del controller (003).
Fiddle
vi consiglio di utilizzare richiedere definizione della direttiva e passare regolatore genitore al controllore bambino –
Perché queste direttive a tutti considerato che non fanno nulla? Se sono solo illustrativi del problema, queste direttive * dovrebbero sempre * essere usate insieme o potrebbero essere usate separatamente?Vuoi che la direttivaB sia sempre inclusa in riferimento all'ambito della direttiva A invece di un nuovo figlio del genitore? Perché direttivaA ha un ambito isolato ma la direttiva B non dichiara alcun nuovo ambito? –
@JoshDavidMiller Ho aggiunto un po 'più di profondità alla descrizione sopra. Per quanto riguarda l'ambito non dichiarato su 'B' e l'ambito isolato su' A' - Non ho impostato in questo modo per nessuna ragione in particolare. Tutto quello che so è che ho bisogno di passare alcuni dati dal DOM alla direttiva (s), e il modo migliore sembrava essere 'scope: {xxx: '@'}' – jlb