Подтвердить что ты не робот

Получить все дочерние области в Angularjs с учетом родительской области

Я хотел бы знать, как получить список всех дочерних областей с учетом родительской области. Все, что я могу найти по свойствам области: $$ childHead, $$ childTail, $$ nextSibling и $$ prevSibling.

Подход, который я использую сейчас, - это получить childHead от родителя, а затем использовать nextSibling для получения следующего дочернего элемента, пока nextSibling не будет равен нулю.

Есть ли лучший подход? Учитывая, что я хочу вызвать метод [getModel] для всех детей, есть ли еще лучший способ сделать это?

4b9b3361

Ответ 1

В дочерних директивах используются изолированные области и у них есть свои собственные значения, которые не видны родителям. Я хочу получить доступ к этим значениям из родительской области.

"Angular способ" для решения проблемы "родительских областей, требующих доступа к дочерним областям", состоит в том, чтобы переместить модель в родительский объект и иметь дочерние области ссылки на родительские свойства/данные (а не на дочерние области, имеющие собственные локальные свойства/копии). Например, мы имеем дело с ng-repeat, если каждая итерация содержит, например, элемент входной формы (т.е. Каждая итерация требует двухсторонней привязки данных): Сложность с ng-model, ng-repeat и входы

С директивами сначала определите массив объектов в родительской области, а затем каждая изолированная дочерняя область доступа получит этот родительский массив областей (или отдельный объект), используя нотацию '=' (т.е. двустороннюю привязку привязки данных). Поскольку объект разделяется, изолированные области будут ссылаться на родительские объекты (они не будут получать локальную копию). Теперь любые изменения, внесенные в свойства дочерних областей, фактически изменяют свойства родительской области.

Ответ 2

Все области Angular прикреплены к элементу DOM, вы можете начать с проверки дочернего элемента, используя текущий элемент, до любого дочернего объекта, которого хотите достичь. После этого используйте функцию ниже для получения области.

angular.element('#5th_element').scope();

Ответ 3

В AngularJS 1.3.2 к модулю ngMock был добавлен метод countChildScopes:

/**
* @ngdoc method
* @name $rootScope.Scope#$countChildScopes
* @module ngMock
* @description
* Counts all the direct and indirect child scopes of the current scope.
*
* The current scope is excluded from the count. The count includes all isolate child scopes.
*
* @returns {number} Total number of child scopes.
*/
function countChildScopes(scope) 
  {
  // jshint validthis: true
  var count = 0; // exclude the current scope
  var root = scope || angular.element(document).injector().get('$rootScope');
  var pendingChildHeads = [root.$$childHead];
  var currentScope;

  while (pendingChildHeads.length) 
    {
    currentScope = pendingChildHeads.shift();

    while (currentScope) 
      {
      count += 1;
      pendingChildHeads.push(currentScope.$$childHead);
      currentScope = currentScope.$$nextSibling;
      }
    }

  return count;
  }

Используйте объект как возвращаемое значение для получения идентификаторов:

function enumerateChildScopes(scope) 
  {
  // jshint validthis: true
  var enum = {}; // exclude the current scope
  var root = scope || angular.element(document).injector().get('$rootScope');
  var pendingChildHeads = [root.$$childHead];
  var currentScope;

  while (pendingChildHeads.length) 
    {
    currentScope = pendingChildHeads.shift();

    while (currentScope) 
      {
      enum["scope"+pendingChildHeads.length] = currentScope.$id;
      pendingChildHeads.push(currentScope.$$childHead);
      currentScope = currentScope.$$nextSibling;
      }
    }

  return enum;
  }

Ссылки