AngularJS – Доступ к охвату ребенка

Если у меня есть следующие controllerы:

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 в parent , не будет ли это сделать семантически неправильно, если предположить, что b является свойством, которое описывает что-то, связанное с child а не parent ?

Обновление. Если подумать об этом, если более одного ребенка имеет b это создаст конфликт для parent на котором b будет извлекаться. Мой вопрос остается, каков правильный способ доступа к b от parent ?

Области в AngularJS используют прототипное наследование, при поиске свойства в области дочерних объектов интерпретатор будет искать цепочку прототипов, начиная с ребенка, и продолжать их до тех пор, пока не найдет свойство, а не наоборот.

Ознакомьтесь с комментариями Vojta по проблеме https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J.

Вкратце: вы не можете получить доступ к дочерним областям из родительской области.

Ваши решения:

  1. Определите свойства в родителях и получите доступ к ним от детей (прочитайте ссылку выше)
  2. Использовать службу для совместного использования
  3. Передача данных через события. $emit отправляет события вверх родителям до тех пор, пока корневая область и $broadcast отправят события вниз. Это может помочь вам сохранить вещи семантически правильно.

Хотя ответ jm – лучший способ справиться с этим делом, для дальнейшего использования можно получить доступ к дочерним областям с помощью членов $$ childHead, $$ childTail, $$ nextSibling и $$ prevSibling. Они не документированы, поэтому они могут меняться без предупреждения, но они есть, если вам действительно нужно пересекать области.

 // get $$childHead first and then iterate that scope's $$nextSiblings for(var cs = scope.$$childHead; cs; cs = cs.$$nextSibling) { // cs is child scope } 

скрипка

Вы можете попробовать следующее:

 $scope.child = {} //declare it in parent controller (scope) 

затем в дочернем controllerе (область) добавьте:

 var parentScope = $scope.$parent; parentScope.child = $scope; 

Теперь родитель имеет доступ к охвату ребенка.

Одним из возможных способов решения проблемы является введение дочернего controllerа в родительский controller с помощью функции init.

Возможная реализация:

 
...
...

Где у ChildController вас есть:

 app.controller('ChildController', ['$scope', '$rootScope', function ($scope, $rootScope) { this.init = function() { $scope.parentCtrl.childCtrl = $scope.childCtrl; $scope.childCtrl.test = 'aaaa'; }; }]) 

Итак, теперь в ParentController вы можете использовать:

 app.controller('ParentController', ['$scope', '$rootScope', 'service', function ($scope, $rootScope, service) { this.save = function() { service.save({ a: $scope.parentCtrl.ChildCtrl.test }); }; }]) 

Важный:
Чтобы правильно работать, вам нужно использовать директиву ng-controller и переименовать каждый controller, как и в html, например.

Советы:
Во время процесса используйте инспектор хромового плагина. Это поможет вам понять дерево.

Да, мы можем назначить переменные из дочернего controllerа переменным родительского controllerа. Это один из возможных способов:

Обзор . Основная цель приведенного ниже кода состоит в том, чтобы присвоить $ scope scope_domain дочернего controllerа объекту $ scope_assign родительского controllerа.

Объяснение: Есть два controllerа. В html обратите внимание, что родительский controller включает дочерний controller. Это означает, что родительский controller будет выполнен до дочернего controllerа. Итак, первый setValue () будет определен, а затем элемент управления перейдет к дочернему controllerу. $ scope.variable будет назначен как «дочерний». Затем этот дочерний объект будет передан как аргумент функции родительского controllerа, где $ scope.assign получит значение как «дочерний»,

      

this is parent: {{assign}}

this is {{variable}}

Я не уверен, должен ли вы «иметь» доступ к дочерней сфере от родителя, но это возможно. Я знаю это, потому что я сделал это сам. Вот мой сценарий:

У меня есть функция, которая перемещает мои страницы, изменяя строку внутри переменной. Эта переменная указана в основном файле index.html как ng-include. Итак, когда строка изменяется, в этот ng-include загружается новый html-файл. Внутри одного из этих html-файлов у меня есть еще один ng-include. Подумайте об этом как о маленьком окне в первом окне. Каждый раз, когда я изменяю содержимое в этих windowsх, я также меняю содержимое боковой панели. Эта боковая панель находится на родительском уровне. Но, когда я перехожу в меньшее окно внутри родителя, на боковой панели этого родительского уровня есть навигационные ссылки, которые меняют вещи в маленьком окне. Поскольку боковая панель находится на родительском уровне, а навигация для меньшего windows позаботится в своем собственном controllerе на уровне дочернего уровня, когда я нажимаю ссылки на боковой панели, он должен редактировать дочерний controller. Это может быть плохое программирование. Честно говоря, я не знаю. Я только начал с angularjs несколько месяцев назад, и я все еще учусь. Но, чтобы заставить его работать для моего сценария, я создал функцию в родительской области, которая вызывается при загрузке детской области:

 function parent($scope, service) { setCurrentChildController = function (childScope) { this.$scope.childScope = childScope; } } function child($scope) { scope.$parent.setCurrentChildController($scope); } 

поэтому теперь переменная родительской области $ scope.childScope по существу является областью controllerа. Он имеет доступ ко всем переменным и функциям в пределах дочернего объекта. Если это плохое программирование, и каждый может придумать альтернативное решение проблемы с моим сценарием, это было бы здорово. Но это работает, если это необходимо.

  • AngularJS: ngInclude vs директива
  • Местоположение AngularJS $ не меняет путь
  • AngularJS - удалять пробелы в верхнем и заднем пространстве из поля ввода с использованием регулярного выражения
  • угловой ng-bind-html и директива внутри него
  • HTML5 Video не работает с тегом AngularJS ng-src
  • Форма перехода к директиве
  • Угловая js init ng-model от значений по умолчанию
  • Как создать сервер localhost для запуска проекта AngularJS
  • Добавление нескольких classов с использованием ng-classа
  • угловое - доступ к данным нескольких HTTP-вызовов - как решить обещания
  • Угловой фильтр работает, но приводит к тому,
  • Interesting Posts

    Как читать файл из jar в Java?

    Масштаб (или центр) водяного знака с ffmpeg до того же разрешения, что и выходной файл

    Рекурсивный вызов ConcurrentHashMap.computeIfAbsent () никогда не завершается. Ошибка или «функция»?

    Изменить статус по умолчанию Magento для дублированных продуктов

    Что такое эквивалент C # для NaN или IsNumeric?

    Как реализовать «mustMatch» и «selectFirst» в автозаполнении пользовательского интерфейса jQuery?

    как читать переменную системной среды в Spring applicationContext

    Проверьте, выводит ли команда пустую строку

    Локальный DNS-сервер

    Как подключить этот ноутбук SATA HDD к обычным настольным SATA-кабелям?

    Кнопка «Пуск» для Windows 8

    Несколько портов (8005, 8080, 8009), требуемых Tomcat Server на локальном хосте, уже используются

    общие глобальные переменные в C

    Будет ли более высокая температура повреждать компьютер с течением времени, даже если он не достигнет максимума?

    Свойства системы Java и переменные среды

    Давайте будем гением компьютера.