Não consigo encontrar uma maneira de chamar uma função no escopo pai de uma diretiva sem usar o escopo isolado. Eu sei que se eu usar o escopo isolado, posso apenas usar "&" no isolado para acessar a função no escopo pai, mas usar o escopo isolado quando não é necessário tem consequências. Considere o seguinte HTML:
<button ng-hide="hideButton()" confirm="Are you sure?" confirm-action="doIt()">Do It</button>
Neste exemplo simples, quero mostrar uma caixa de diálogo de confirmação de JavaScript e apenas chamar doIt () se clicar em "OK" na caixa de diálogo de confirmação. Isso é simples usando um escopo isolado. A diretiva ficaria assim:
.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();
}
});
}
};
})
Mas o problema é que, como estou usando escopo isolado, ng-hide no exemplo acima não é mais executado no escopo pai , mas sim no escopo isolado (uma vez que usar um escopo isolado em qualquer diretiva faz com que todas as diretivas nesse elemento usar o escopo isolado). Aqui está um jsFiddle do exemplo acima em que ng-hide não está funcionando. (Observe que neste violino, o botão deve se ocultar quando você digita "sim" na caixa de entrada.)
A alternativa seria NÃO utilizar um âmbito de aplicação isolado , o que de facto é o que pretendo aqui, uma vez que não há necessidade de isolar o âmbito desta directiva. O único problema que tenho é como chamo um método no escopo pai se não o transmito no escopo isolado ?
Aqui está um jsfiddle onde NÃO estou usando escopo isolado e o ng-hide está funcionando bem, mas, é claro, a chamada para confirmAction () não funciona e não sei como fazê-la funcionar.
Observe que a resposta que realmente estou procurando é como chamar funções no escopo externo SEM usar um escopo isolado. E não estou interessado em fazer com que esse diálogo de confirmação funcione de outra maneira, porque o objetivo desta questão é descobrir como fazer chamadas para o escopo externo e ainda ser capaz de fazer outras diretivas funcionarem contra o escopo pai.
Como alternativa, eu estaria interessado em ouvir sobre soluções que usam um escopo isolado se outras diretivas ainda funcionarem contra o escopo pai , mas não acho que isso seja possível.