Si tengo los siguientes controladores:
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
¿Cuál es la forma correcta de dejar salir la parent
lectura ? Si es necesario definir en , ¿no lo haría semánticamente incorrecto asumiendo que es una propiedad que describe algo relacionado y no ?b
child
b
parent
b
child
parent
Actualización: Pensando más en ello, si más de un niño lo tuviera b
, se crearía un conflicto por parent
el cual b
recuperar. Mi pregunta sigue siendo, ¿cuál es la forma correcta de acceder b
desde parent
?
Respuestas:
Los ámbitos en AngularJS utilizan la herencia prototípica, al buscar una propiedad en un ámbito secundario, el intérprete buscará la cadena del prototipo a partir del elemento secundario y continuará hasta los padres hasta que encuentre la propiedad, no al revés.
Consulte los comentarios de Vojta sobre el problema https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J
En pocas palabras: no puede acceder a los ámbitos secundarios desde un ámbito principal.
Tus soluciones:
$emit
envía eventos hacia arriba a los padres hasta el alcance raíz y$broadcast
envía eventos hacia abajo. Esto podría ayudarlo a mantener las cosas semánticamente correctas.fuente
localStorage
con una dependencia comongStorage
.Si bien la respuesta de jm-es la mejor manera de manejar este caso, para referencia futura es posible acceder a los ámbitos secundarios utilizando los miembros $$ childHead, $$ childTail, $$ nextSibling y $$ prevSibling de un alcance. Estos no están documentados, por lo que pueden cambiar sin previo aviso, pero están ahí si realmente necesita atravesar los ámbitos.
Violín
fuente
Puedes probar esto:
luego en el controlador secundario (alcance) agregue:
Ahora el padre tiene acceso al alcance del niño.
fuente
Una posible solución es inyectar el controlador secundario en el controlador principal mediante una función de inicio.
Posible implementación:
¿Dónde
ChildController
tienes:Entonces ahora en el
ParentController
puedes usar:Importante:
Para que funcione correctamente, debe usar la directiva
ng-controller
y cambiar el nombre de cada controladoras
como lo hice en el html, por ejemplo.Consejos:
Utilice el plugin ng-inspector de Chrome durante el proceso. Te ayudará a entender el árbol.
fuente
Usando $ emit y $ broadcast , (como lo menciona walv en los comentarios anteriores)
Para disparar un evento hacia arriba (de niño a padre)
Para disparar un evento hacia abajo (de padre a hijo)
y finalmente escuchar
Para más detalles: - https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Disfruta :)
fuente
Sí, podemos asignar variables del controlador secundario a las variables del controlador principal. Esta es una forma posible:
Descripción general: el objetivo principal del código, a continuación, es asignar $ scope.variable del controlador secundario al $ scope.assign del controlador principal
Explicación: Hay dos controladores. En el html, observe que el controlador principal incluye el controlador secundario. Eso significa que el controlador principal se ejecutará antes que el controlador secundario. Entonces, primero se definirá setValue () y luego el control irá al controlador secundario. $ scope.variable se asignará como "hijo". Luego, este alcance secundario se pasará como un argumento a la función del controlador principal, donde $ scope.assign obtendrá el valor como "secundario"
fuente