Non riesco a trovare un modo per chiamare una funzione sull'ambito padre dall'interno di una direttiva senza utilizzare l'ambito isolato. So che se utilizzo l'ambito isolato posso semplicemente usare "&" nell'isolato per accedere alla funzione sull'ambito padre, ma l'uso dell'ambito isolato quando non è necessario ha delle conseguenze. Considera il seguente HTML:
<button ng-hide="hideButton()" confirm="Are you sure?" confirm-action="doIt()">Do It</button>
In questo semplice esempio, voglio mostrare una finestra di dialogo di conferma JavaScript e chiamare doIt () solo se fanno clic su "OK" nella finestra di dialogo 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 è che, poiché sto usando uno scope isolato, ng-hide nell'esempio sopra non viene più eseguito sullo scope genitore , ma piuttosto nello scope isolato (poiché l'uso di uno scope isolato su qualsiasi direttiva fa sì che tutte le direttive su quell'elemento utilizzare l'ambito isolato). Ecco un jsFiddle dell'esempio precedente in cui ng-hide non funziona. (Nota che in questo violino, il pulsante dovrebbe nascondersi quando digiti "sì" nella casella di immissione.)
L'alternativa sarebbe NON utilizzare un campo di applicazione isolato , che in realtà è ciò che desidero veramente qui poiché non è necessario isolare il campo di applicazione di questa direttiva. L'unico problema che ho è, come posso chiamare un metodo sull'ambito padre se non lo passo su un ambito isolato ?
Ecco un jsfiddle in cui NON sto usando l'ambito isolato e ng-hide funziona bene, ma, ovviamente, la chiamata a confirmAction () non funziona e non so come farlo funzionare.
Si prega di notare, la risposta che sto davvero cercando è come chiamare le funzioni sull'ambito esterno SENZA utilizzare un ambito isolato. E non mi interessa far funzionare questo dialogo 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 continueranno a funzionare contro l'ambito padre , ma non credo che ciò sia possibile.