Pergunta

Gostaria de saber como obter uma lista de todos os escopos filhos, considerando um escopo pai.Tudo o que posso encontrar nas propriedades do escopo são $$childHead, $$childTail, $$nextSibling e $$prevSibling.

A abordagem que estou usando agora é obter o childHead do pai e, em seguida, usar o nextSibling para obter o próximo filho até que nextSibling seja nulo.

Existe uma abordagem melhor?Dado que quero chamar um método [getModel] em todos os filhos, existe novamente uma maneira melhor de fazer isso?

Foi útil?

Solução

.

As diretrizes da criança estão usando escopos isolados e, em tais, têm seus próprios valores que não são visíveis a partir do pai. Eu quero acessar esses valores do escopo pai.

A "maneira angular" para lidar com a questão de "escopos pais que necessitam de acesso a escopos infantis" é mover o modelo para o pai, e ter os escopos filhos referência às propriedades do pai / dados (em vez dos escopos da criança ter suas próprias propriedades locais / cópias). Por exemplo, é assim que lidamos com ng-repetição se cada iteração contenha, digamos, um elemento de formulário de entrada (ou seja, cada iteração precisa de dados de duas vias): Dificuldade com NG-Model, NG-Repetir e Entradas

Com diretivas, primeiro definir uma matriz de objetos no escopo dos pais e, em seguida, tenha cada escopo de criança isolado acessar essa matriz de escopo pai (ou objeto individual) usando a notação '=' (i.e., notação de dados de duas vias). Como um objeto está sendo compartilhado, os escopos isolados irão referenciar os objetos pai (eles não receberão uma cópia local). Agora, quaisquer alterações feitas para as propriedades do Scopes da Criança estão realmente alterando as propriedades do escopo pai.

Outras dicas

Todos os escopos Angular estão anexados ao elemento DOM. Você pode começar inspecionando o filho usando o elemento atual até qualquer filho que deseja alcançar.Uma vez lá, use a função abaixo para obter o escopo.

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

No AngularJS 1.3.2, um countChildScopes método foi adicionado ao módulo ngMock:

/**
* @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;
  }

Use um objeto como valor de retorno para obter os IDs:

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;
  }

Referências

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top