Estou procurando qualquer maneira de acessar o escopo "pai" dentro de uma diretiva. Qualquer combinação de escopo, transcluir, exigir, passar variáveis (ou o próprio escopo) de cima, etc. Estou totalmente disposta a reverter, mas quero evitar algo totalmente hacky ou inatingível. Por exemplo, eu sei que poderia fazê-lo agora pegando os $scope
parâmetros do preLink e iterando sobre seus $sibling
escopos para encontrar o "pai" conceitual.
O que eu realmente quero é ser capaz de $watch
uma expressão no escopo pai. Se eu puder fazer isso, posso realizar o que estou tentando fazer aqui:
AngularJS - Como renderizar uma parcial com variáveis?
Uma observação importante é que a diretiva deve ser reutilizável dentro do mesmo escopo pai. Portanto, o comportamento padrão (escopo: false) não funciona para mim. Preciso de um escopo individual por instância da diretiva e, em seguida, preciso de $watch
uma variável que viva no escopo pai.
Uma amostra de código vale 1.000 palavras, portanto:
app.directive('watchingMyParentScope', function() {
return {
require: /* ? */,
scope: /* ? */,
transclude: /* ? */,
controller: /* ? */,
compile: function(el,attr,trans) {
// Can I get the $parent from the transclusion function somehow?
return {
pre: function($s, $e, $a, parentControl) {
// Can I get the $parent from the parent controller?
// By setting this.$scope = $scope from within that controller?
// Can I get the $parent from the current $scope?
// Can I pass the $parent scope in as an attribute and define
// it as part of this directive's scope definition?
// What don't I understand about how directives work and
// how their scope is related to their parent?
},
post: function($s, $e, $a, parentControl) {
// Has my situation improved by the time the postLink is called?
}
}
}
};
});
fonte
scope.$watch('localName3', function() { ...[?? WHAT TO DO HERE for example?] });
$parse
com=
: violino .$parse
é necessário apenas com escopos não isolados.Acessar o método do controlador significa acessar um método no escopo pai a partir da diretiva controller / link / scope.
Se a diretiva estiver compartilhando / herdando o escopo pai, é bastante simples invocar um método de escopo pai.
Um pouco mais de trabalho é necessário quando você deseja acessar o método de escopo pai no escopo da diretiva Isolado.
Existem poucas opções (podem ser mais do que as listadas abaixo) para invocar um método de escopo pai a partir do escopo de diretivas isoladas ou observar variáveis de escopo pai ( especialmente a opção nº 6 ).
Observe que usei
link function
nesses exemplos, mas você também pode usar umdirective controller
com base nos requisitos.Opção 1. Através do objeto literal e do modelo html de diretiva
index.html
itemfilterTemplate.html
app.js
trabalhando plnkr: http://plnkr.co/edit/rgKUsYGDo9O3tewL6xgr?p=preview
Opção 2. Através do objeto literal e do link / escopo da diretiva
index.html
itemfilterTemplate.html
app.js
plnkr de trabalho: http://plnkr.co/edit/BRvYm2SpSpBK9uxNIcTa?p=preview
Opção # 3. Através da referência de função e do modelo de diretiva html
index.html
itemfilterTemplate.html
app.js
plnkr de trabalho: http://plnkr.co/edit/Jo6FcYfVXCCg3vH42BIz?p=preview
Opção # 4. Através da referência de função e do link / escopo da diretiva
index.html
itemfilterTemplate.html
app.js
plnkr de trabalho: http://plnkr.co/edit/BSqx2J1yCY86IJwAnQF1?p=preview
Opção 5: através do modelo ng e da ligação bidirecional, você pode atualizar as variáveis do escopo pai. . Portanto, talvez não seja necessário chamar funções de escopo pai em alguns casos.
index.html
itemfilterTemplate.html
app.js
trabalhando plnkr: http://plnkr.co/edit/hNui3xgzdTnfcdzljihY?p=preview
Opção 6: Complementar
$watch
e$watchCollection
É de duas vias,items
nos exemplos acima, se os itens forem modificados no escopo pai, os itens na diretiva também refletirão as alterações.Se você quiser assistir outros atributos ou objetos do escopo pai, poderá fazer isso usando
$watch
e$watchCollection
como indicado abaixohtml
script app.js
var app = angular.module ('plunker', []);
Você sempre pode consultar a documentação do AngularJs para obter explicações detalhadas sobre diretivas.
fonte
e você terá o mesmo escopo (com elemento pai)
Existem várias maneiras de acessar o escopo pai, dependendo dessas duas opções escopo e transcluir.
fonte
Aqui está um truque que usei uma vez: crie uma diretiva "fictícia" para manter o escopo pai e coloque-o em algum lugar fora da diretiva desejada. Algo como:
e depois
Talvez não seja a solução mais elegante, mas conseguiu o trabalho.
fonte
Se você estiver usando classes e
ControllerAs
sintaxe do ES6 , precisará fazer algo um pouco diferente.Veja o trecho abaixo e observe que esse
vm
é oControllerAs
valor do controlador pai, conforme usado no HTML paifonte
Tendo tentado de tudo, finalmente cheguei a uma solução.
Basta colocar o seguinte no seu modelo:
{{currentDirective.attr = parentDirective.attr; ''}}
Ele apenas grava o atributo / variável do escopo pai que você deseja acessar no escopo atual.
Observe também que,
; ''
no final da instrução, é para garantir que não haja saída no seu modelo. (Angular avalia todas as instruções, mas apenas produz a última).É um pouco hacky, mas depois de algumas horas de tentativa e erro, ele faz o trabalho.
fonte