Получить все дочерние области в Angularjs с учетом родительской области
Я хотел бы знать, как получить список всех дочерних областей с учетом родительской области. Все, что я могу найти по свойствам области: $$ childHead, $$ childTail, $$ nextSibling и $$ prevSibling.
Подход, который я использую сейчас, - это получить childHead от родителя, а затем использовать nextSibling для получения следующего дочернего элемента, пока nextSibling не будет равен нулю.
Есть ли лучший подход?
Учитывая, что я хочу вызвать метод [getModel] для всех детей, есть ли еще лучший способ сделать это?
Ответы
Ответ 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;
}
Ссылки