Llegar a obtener todos los ámbitos secundarios en Angularjs dado el ámbito primario
-
11-12-2019 - |
Pregunta
Me gustaría saber cómo obtener una lista de todos los ámbitos secundarios dado un ámbito primario.Todo lo que puede encontrar a partir de las propiedades de alcance son $$childHead, $$childTail, $$nextSibling y $$prevSibling.
El enfoque que estoy usando ahora es conseguir que el childHead de los padres y, a continuación, utilizando la nextSibling para obtener el siguiente niño hasta nextSibling es nulo.
Hay un método mejor?Dado que quiero llamar a un método [llamado getmodel] en todos los niños, hay de nuevo una mejor manera de hacer esto?
Solución
Las directivas infantiles están utilizando los ámbitos aislados y, a tales, tienen sus propios valores que no son visibles desde el padre. Quiero acceder a estos valores del ámbito de los padres.
La 'forma angular' para lidiar con la cuestión de "los ámbitos de los padres que necesitan acceso a los ámbitos infantiles" es mover el modelo hacia arriba en el padre, y hacer que los ámbitos infantil hacen referencia a las propiedades / datos de los padres (en lugar de los escopos infantiles Tener sus propias propiedades / copias locales). Por ejemplo, esta es la forma en que tratamos con NG-Repetir si se contiene cada iteración, por ejemplo, un elemento de formulario de entrada (es decir, cada iteración necesita indicador de datos de dos vías): Dificultad con NG-Model, NG-Repett y Entradas
Con las directivas, primero defina una matriz de objetos en el ámbito de los padres, luego tiene cada alcance secundario aislado Acceda a la matriz de alcance de los padres (o objeto individual) utilizando la notación '=' (I.E., Notación de Date de datos de dos vías). Debido a que se está compartiendo un objeto, los ámbitos aislados hará referencia a los objetos principales (no recibirán una copia local). Ahora, cualquier cambio que realice a las propiedades de los ámbitos infantil en realidad está cambiando las propiedades del alcance de los padres.
Otros consejos
Todo el alcance angular está unido al elemento DOM, puede comenzar a inspeccionar al niño utilizando el elemento actual hacia abajo a cualquier niño que desee alcanzar.Una vez allí, use la función a continuación para obtener el alcance.
angular.element('#5th_element').scope();
En AngularJS 1.3.2, un countChildScopes
el método fue añadido a la ngMock módulo:
/** * @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; }
El uso de un objeto como valor de retorno para obtener el Id:
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; }
Referencias