Questa domanda è già stata picchiata a morte, ma la condividerò comunque nel caso in cui qualcun altro stia lottando con il disastro orribile che è gli scopi di AngularJS. Questa copertura volontà =
, <
, @
, &
e ::
. La scrittura completa può essere trovata qui .
=
stabilisce un'associazione a due vie. La modifica della proprietà nel genitore comporterà la modifica nel figlio e viceversa.
<
stabilisce un legame unidirezionale, da genitore a figlio. La modifica della proprietà nel genitore comporterà una modifica nel figlio, ma la modifica della proprietà del figlio non influirà sulla proprietà del genitore.
@
assegnerà alla proprietà figlio il valore stringa dell'attributo tag. Se l'attributo contiene un'espressione , la proprietà figlio si aggiorna ogni volta che l'espressione restituisce una stringa diversa. Per esempio:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
Qui, la description
proprietà nell'ambito secondario sarà il valore corrente dell'espressione "The movie title is {{$ctrl.movie.title}}"
, dove si movie
trova un oggetto nell'ambito secondario.
&
è un po 'complicato, e in effetti non sembra esserci alcun motivo convincente per usarlo mai. Consente di valutare un'espressione nell'ambito genitore, sostituendo i parametri con variabili dall'ambito figlio. Un esempio ( plunk ):
<child-component
foo = "myVar + $ctrl.parentVar + myOtherVar"
</child-component>
angular.module('heroApp').component('childComponent', {
template: "<div>{{ $ctrl.parentFoo({myVar:5, myOtherVar:'xyz'}) }}</div>",
bindings: {
parentFoo: '&foo'
}
});
Dato parentVar=10
, l'espressione parentFoo({myVar:5, myOtherVar:'xyz'})
verrà valutata 5 + 10 + 'xyz'
e il componente verrà visualizzato come:
<div>15xyz</div>
Quando vorresti mai usare questa funzionalità contorta? &
viene spesso utilizzato dalle persone per passare all'ambito figlio una funzione di richiamata nell'ambito padre. In realtà, tuttavia, lo stesso effetto può essere ottenuto usando '<' per passare la funzione, che è più semplice ed evita la sintassi di parentesi graffe goffe per passare parametri ( {myVar:5, myOtherVar:'xyz'}
). Prendere in considerazione:
Richiamata utilizzando &
:
<child-component parent-foo="$ctrl.foo(bar)"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo({bar:'xyz'})">Call foo in parent</button>',
bindings: {
parentFoo: '&'
}
});
Richiamata utilizzando <
:
<child-component parent-foo="$ctrl.foo"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo('xyz')">Call foo in parent</button>',
bindings: {
parentFoo: '<'
}
});
Si noti che gli oggetti (e le matrici) vengono passati in riferimento all'ambito figlio, non copiati. Ciò significa che anche se si tratta di un'associazione unidirezionale, si sta lavorando con lo stesso oggetto sia nell'ambito padre che figlio.
Per vedere i diversi prefissi in azione, apri questo plunk .
Rilegatura singola (inizializzazione) utilizzando
::
[Documenti ufficiali]
Le versioni successive di AngularJS introducono l'opzione per avere un'associazione unica, in cui la proprietà dell'ambito figlio viene aggiornata una sola volta. Ciò migliora le prestazioni eliminando la necessità di controllare la proprietà padre. La sintassi è diversa da quella sopra; per dichiarare un'associazione una tantum, aggiungi ::
davanti all'espressione nel tag del componente :
<child-component
tagline = "::$ctrl.tagline">
</child-component>
Questo propagherà il valore tagline
dell'ambito figlio senza stabilire un'associazione unidirezionale o bidirezionale. Nota : se tagline
è inizialmente undefined
nell'ambito genitore, angolare lo controllerà fino a quando non cambia e quindi effettua un aggiornamento una tantum della proprietà corrispondente nell'ambito secondario.
Sommario
La tabella seguente mostra come funzionano i prefissi a seconda che la proprietà sia un oggetto, un array, una stringa, ecc.