Non riesco a trovare un modo per chiamare una funzione sull'ambito principale da una direttiva senza utilizzare l'ambito isolato. So che se uso un ambito isolato posso semplicemente usare "&" nell'isolato per accedere alla funzione sull'ambito genitore, ma usare l'ambito isolato quando non è necessario ha delle conseguenze. Si consideri il seguente codice HTML:Chiamare una funzione controller da una direttiva senza ambito isolato in AngularJS
<button ng-hide="hideButton()" confirm="Are you sure?" confirm-action="doIt()">Do It</button>
In questo semplice esempio, voglio mostrare un JavaScript confermare finestra e chiamare solo doIt() se si clicca su "OK" nella finestra di conferma. Questo è semplice utilizzando un ambito isolato. La direttiva sarebbe simile a questa:
.directive('confirm', function() {
return {
restrict: 'A',
scope: {
confirm: '@',
confirmAction: '&'
},
link: function (scope, element, attrs) {
element.bind('click', function (e) {
if (confirm(scope.confirm)) {
scope.confirmAction();
}
});
}
};
})
Ma il problema è, perché sto utilizzando ambito isolato, ng-nascondere nell'esempio di cui sopra non esegue più contro la portata genitore, ma piuttosto nel campo di applicazione isolata (poiché l'utilizzo di un ambito isolato su qualsiasi direttiva fa sì che tutte le direttive su quell'elemento utilizzino l'ambito isolato). Here is a jsFiddle dell'esempio precedente dove ng-hide non funziona. (Nota che in questo violino, il pulsante dovrebbe nascondersi quando si digita "sì" nella casella di input.)
L'alternativa sarebbe a NON utilizzare un ambito isolato, che in realtà è ciò che voglio veramente qui da lì non è necessario isolare il campo di applicazione di questa direttiva. L'unico problema che ho è, , come posso chiamare un metodo sull'ambito genitore se non lo inoltro sull'ambito isolato?
Here is a jsfiddle dove NON sto usando scope isolato e il ng-hide sta funzionando bene, ma, ovviamente, la chiamata a confirmAction() non funziona, e non so come farlo funzionare.
Si prega di notare che la risposta che sto cercando è come chiamare le funzioni sullo scope esterno SENZA usare un ambito isolato. E non sono interessato a far funzionare questa finestra di conferma in un altro modo, perché il punto di questa domanda è capire come effettuare chiamate all'ambito esterno ed essere ancora in grado di far funzionare altre direttive contro l'ambito genitore.
In alternativa, sarei interessato a conoscere soluzioni che utilizzano un ambito isolato se altre direttive funzioneranno ancora contro lo scope genitore, ma non penso sia possibile.
per chi passa da, Dan Wahlin ha scritto un ottimo articolo che spiega isolare la portata e la funzione dei parametri: http://weblogs.asp.net/dwahlin/creating -custom-angularjs-directives-part-3-isolate-scope-and-function-parameters –