Estoy buscando cualquier forma de acceder al alcance "principal" dentro de una directiva. Cualquier combinación de alcance, transcluir, requerir, pasar variables (o el alcance en sí) desde arriba, etc. Estoy totalmente dispuesto a inclinarme hacia atrás, pero quiero evitar algo totalmente hacky o imposible de mantener. Por ejemplo, sé que podría hacerlo en este momento tomando los $scope
parámetros de preLink e iterando sobre sus $sibling
ámbitos para encontrar el "padre" conceptual.
Lo que realmente quiero es poder $watch
una expresión en el ámbito primario. Si puedo hacer eso, entonces puedo lograr lo que estoy tratando de hacer aquí:
AngularJS: ¿cómo representar un parcial con variables?
Una nota importante es que la directiva debe ser reutilizable dentro del mismo ámbito principal. Por lo tanto, el comportamiento predeterminado (alcance: falso) no funciona para mí. Necesito un ámbito individual por instancia de la directiva, y luego necesito $watch
una variable que viva en el ámbito primario.
Una muestra de código vale 1000 palabras, entonces:
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?
}
}
}
};
});
fuente
scope.$watch('localName3', function() { ...[?? WHAT TO DO HERE for example?] });
$parse
con=
: violín .$parse
solo se necesita con ámbitos no aislados.Acceder al método del controlador significa acceder a un método en el alcance principal desde el controlador / enlace / alcance de la directiva.
Si la directiva comparte / hereda el ámbito primario, entonces es bastante sencillo invocar un método de ámbito primario.
Se requiere un poco más de trabajo cuando desea acceder al método de ámbito primario desde el ámbito de directiva aislado.
Hay pocas opciones (pueden ser más que las que se enumeran a continuación) para invocar un método de alcance primario desde el alcance de directivas aisladas o ver variables de alcance primario ( opción # 6 especialmente).
Tenga en cuenta que lo utilicé
link function
en estos ejemplos, pero también puede utilizarlodirective controller
según los requisitos.Opción 1. A través del objeto literal y de la plantilla html de la directiva
index.html
itemfilterTemplate.html
app.js
trabajo plnkr: http://plnkr.co/edit/rgKUsYGDo9O3tewL6xgr?p=preview
Opcion 2. A través del objeto literal y del enlace / alcance de la directiva
index.html
itemfilterTemplate.html
app.js
trabajo plnkr: http://plnkr.co/edit/BRvYm2SpSpBK9uxNIcTa?p=preview
Opción # 3. A través de la referencia de funciones y de la plantilla de directiva html
index.html
itemfilterTemplate.html
app.js
trabajo plnkr: http://plnkr.co/edit/Jo6FcYfVXCCg3vH42BIz?p=preview
Opción # 4. A través de la referencia de funciones y del enlace / alcance de la directiva
index.html
itemfilterTemplate.html
app.js
trabajo plnkr: http://plnkr.co/edit/BSqx2J1yCY86IJwAnQF1?p=preview
Opción n. ° 5: a través de ng-model y enlace bidireccional, puede actualizar las variables de ámbito principal. . Por lo tanto, es posible que no necesite invocar funciones de ámbito principal en algunos casos.
index.html
itemfilterTemplate.html
app.js
trabajo plnkr: http://plnkr.co/edit/hNui3xgzdTnfcdzljihY?p=preview
Opción # 6: a través
$watch
y$watchCollection
es vinculanteitems
en ambos sentidos en todos los ejemplos anteriores, si los elementos se modifican en el ámbito principal, los elementos en la directiva también reflejarían los cambios.Si desea ver otros atributos u objetos desde el ámbito primario, puede hacerlo utilizando
$watch
y$watchCollection
como se indica a continuaciónhtml
script app.js
aplicación var = angular.module ('plunker', []);
Siempre puede consultar la documentación de AngularJs para obtener explicaciones detalladas sobre las directivas.
fuente
y tendrá el mismo alcance (con elemento primario)
Hay muchas formas de acceder al ámbito principal en función de estas dos opciones de ámbito y transcluir.
fuente
Aquí hay un truco que utilicé una vez: crear una directiva "ficticia" para mantener el alcance principal y colocarlo en algún lugar fuera de la directiva deseada. Algo como:
y entonces
Quizás no sea la solución más elegante, pero hizo el trabajo.
fuente
Si está utilizando las clases y la
ControllerAs
sintaxis de ES6 , debe hacer algo ligeramente diferente.Consulte el fragmento a continuación y observe que ese
vm
es elControllerAs
valor del controlador principal tal como se utiliza en el HTML principalfuente
Después de haber intentado todo, finalmente se me ocurrió una solución.
Simplemente coloque lo siguiente en su plantilla:
{{currentDirective.attr = parentDirective.attr; ''}}
Simplemente escribe el atributo / variable de alcance primario al que desea acceder en el alcance actual.
También
; ''
tenga en cuenta que al final de la declaración, es para asegurarse de que no hay salida en su plantilla. (Angular evalúa cada declaración, pero solo genera la última).Es un poco hacky, pero después de algunas horas de prueba y error, hace el trabajo.
fuente