Если у меня следующие контроллеры:
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
Что такое правильный способ , чтобы parent
прочитать b
из child
? Если необходимо определить b
in parent
, не сделает ли это семантически некорректным, если предположить, что b
это свойство описывает что-то, связанное с чем-то, child
а не parent
?
Обновление: Размышляя дальше об этом, если более чем один ребенок имел b
это создало бы конфликт для parent
на который b
необходимо получить. Мой вопрос остается, что правильный способ доступа b
от parent
?
Ответы:
Области видимости в AngularJS используют прототипное наследование, при поиске свойства в дочерней области интерпретатор будет искать цепочку прототипов, начиная с дочернего элемента, и переходить к родителям, пока не найдет свойство, а не наоборот.
Проверьте комментарии Войты по проблеме https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J
В двух словах: вы не можете получить доступ к дочерним областям из родительской области.
Ваши решения:
$emit
отправляет события вверх родительским элементам до корневой области и$broadcast
отправляет события вниз. Это может помочь вам сохранить семантическую правильность.источник
localStorage
с зависимостью вродеngStorage
.Хотя ответ jm- - лучший способ справиться с этим случаем, для справки в будущем можно получить доступ к дочерним областям, используя элементы $$ childHead, $$ childTail, $$ nextSibling и $$ prevSibling области. Они не задокументированы, поэтому могут быть изменены без предварительного уведомления, но они есть, если вам действительно нужно пересечь области.
Скрипка
источник
Вы можете попробовать это:
затем в дочернем контроллере (области) добавьте:
Теперь у родителя есть доступ к дочерней области.
источник
Один из возможных обходных путей - внедрить дочерний контроллер в родительский контроллер с помощью функции init.
Возможная реализация:
Где у
ChildController
вас есть:Итак, теперь
ParentController
вы можете использовать:Важно:
для правильной работы вы должны использовать директиву
ng-controller
и переименовать каждый контроллер,as
как я сделал в html, например.Советы:
используйте в процессе Chrome плагин ng-Inspector . Это поможет вам понять дерево.
источник
Использование $ emit и $ broadcast (как упоминалось walv в комментариях выше)
Чтобы запустить событие вверх (от дочернего к родительскому)
Чтобы запустить событие вниз (от родителя к ребенку)
и наконец послушать
Для получения дополнительной информации: - https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
Наслаждаться :)
источник
Да, мы можем назначать переменные дочернего контроллера переменным родительского контроллера. Это один из возможных способов:
Обзор: основная цель приведенного ниже кода - назначить $ scope.variable дочернего контроллера родительскому контроллеру $ scope.assign.
Пояснение: Есть два контроллера. Обратите внимание, что в HTML-коде родительский контроллер включает дочерний контроллер. Это означает, что родительский контроллер будет выполнен раньше дочернего контроллера. Итак, сначала будет определена setValue (), а затем управление перейдет к дочернему контроллеру. $ scope.variable будет назначен "дочерним". Затем эта дочерняя область будет передана в качестве аргумента функции родительского контроллера, где $ scope.assign получит значение как «дочерний».
источник