Ecco il motivo per cui ho downvoted la risposta.
Innanzitutto, non utilizzare mai '=' per passare i riferimenti di funzione alle direttive.
'=' crea due orologi e li utilizza per garantire che sia l'ambito della direttiva che i riferimenti dell'ambito principale siano gli stessi (associazione bidirezionale). È una pessima idea consentire a una direttiva di cambiare la definizione di una funzione nell'ambito genitore, che è ciò che accade quando si utilizza questo tipo di associazione. Inoltre, gli orologi dovrebbero essere ridotti al minimo - mentre funzionerà, i due orologi extra $ non sono necessari. Quindi non va bene - una parte del voto negativo era per suggerire che lo fosse.
Secondo: la risposta indica erroneamente cosa fa '&'. & non è un "collegamento unidirezionale". Si ottiene quel termine improprio semplicemente perché, a differenza di '=', non crea alcun $ watch e la modifica del valore della proprietà nello scope della direttiva non si propaga al genitore.
Secondo la documentazione:
& o & attr - fornisce un modo per eseguire un'espressione nel contesto la portata genitore
Quando si utilizza & in una direttiva, genera una funzione che restituisce il valore dell'espressione valutata rispetto all'ambito principale. L'espressione non deve essere una chiamata di funzione. Può essere qualsiasi espressione angolare valida. Inoltre, questa funzione generata accetta un argomento oggetto che può sovrascrivere il valore di qualsiasi variabile locale trovata nell'espressione.
Per estendere l'esempio del PO, si supponga che il genitore usa questa direttiva nel modo seguente:
<my-component foo="go()">
Nella direttiva (modello o funzione di collegamento), se si chiama
foo({myVal: 42});
Quello che sta facendo sta valutando l'espressione "go()", che capita di chiamare la funzione "go" sull'ambito genitore, passando nessun argomento.
In alternativa,
<my-component foo="go(value)">
si sta valutando il "go (valore)" espressione sulla portata genitore, che è fondamentalmente chiamando $ parent.go ($ parent.value)"
<my-component foo="go(myVal)">
si sta valutando il "go (myVal)" espressione, ma prima che l'espressione viene valutata, myVal sarà sostituito con 42, quindi l'espressione valutata sarà "go (42)".
<my-component foo="myVal + value + go()">
In questo caso, $ scope.foo ({myVal: 42}) restituirà il risultato di:
42 + $parent.value + $parent.go()
In sostanza, questo modello permette la direttiva per "iniettare" variabili che il consumatore della direttiva può opzionalmente usare nell'espressione foo.
Si potrebbe fare questo:
<my-component foo="go">
e nella direttiva:
$scope.foo()(42)
$ scope.foo() valuterà l'espressione "andare", che restituirà un riferimento al $ funzione genitore.go. Quindi lo chiamerà $ parent.go (42). Lo svantaggio di questo modello è che si otterrà un errore se l'espressione non valuta una funzione.
Il motivo finale per il voto negativo è stata l'affermazione che le direttive ng-event utilizzano &. Questo non è il caso. Nessuno del costruito in direttive creare ambiti isolati con:
scope:{
}
L'attuazione di '& foo' è (semplificata per chiarezza), si riduce a:
$scope.foo = function(locals) {
return $parse(attr.foo)($scope.$parent, locals);
}
L'attuazione di NG-click è simile, ma (anche semplificato):
link: function(scope, elem, attr) {
elem.on('click', function(evt) {
$parse(attr.ngClick)(scope, {
$event: evt
}
});
}
Così la chiave da ricordare è che quando si utilizza '&', non siete passa un functio n - stai passando un'espressione. La direttiva può ottenere il risultato di questa espressione in qualsiasi momento richiamando la funzione generata.
Non vedo nulla di sbagliato in questo modo, ma forse prendere in considerazione la possibilità di delegare a un servizio. – Mosho
Sono titubante perché il collegamento bidirezionale sembra essere progettato per il modello di dati, ma lo sto utilizzando su una funzione. In generale, queste funzioni non dovrebbero essere comunque modificate. –