Pregunta Pasar el valor del alcance principal al bucle ng-repeat en Angular


Esta debería ser una pregunta extremadamente simple, pero todas las soluciones provisionales que he encontrado son complejas. Estoy recorriendo una matriz de objetos al usar ng-repeat en una plantilla de la siguiente manera:

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ campaign.name }} ...
</div>

Como la repetición ng crea un nuevo ámbito, el objeto 'campaña' del controlador no parece accesible. ¿Hay alguna forma (además de agregar el objeto de la campaña a cada elemento en mi matriz) de obtener ese valor?

Gracias por adelantado.


42
2018-05-15 20:01


origen


Respuestas:


Puede acceder al alcance principal usando $ parent

<div class="row-fluid" ng-repeat="message in messages.current|filter:'draft'"> 
    {{ message.subject }} ... {{ $parent.campaign.name }} ...
</div>

72
2018-05-16 01:19



Esta es una forma que funciona que no usa $parent. Busca hacia arriba a través de los ámbitos anidados para encontrar el objeto que está utilizando, sin importar el alcance que tenga que atravesar.

En el alcance que contiene la lista, puede definir un objeto con la lista como una propiedad, como esta:

$scope.obj = {};
$scope.obj.items = ['item1','item2','item3'];

Entonces ten el ng-repeat se parece a esto:

<div ng-repeat="item in obj.items | filter:'item3' track by $index">
    {{obj.items[ obj.items.indexOf(item) ]}}
</div>

(tienes que usar obj.items[ obj.items.indexOf(item) ] más bien que obj.items[ $index ] porque $index es el índice de la matriz filtrada, no el original)

La razón por la que esto funciona es porque mientras obj no existe en el ámbito actual, cuando intenta acceder a su propiedad, Angular se verá por encima del alcance actual en lugar de darle un error (si solo lo intentó) {{obj}} sería indefinido, y Angular estaría feliz de no darte nada en lugar de mirar a través de ámbitos más altos). Este es un enlace útil sobre alcances anidados: http://www.angularjshub.com/examples/basics/nestedcontrollers/

En mi caso, necesitaba el track by $indexporque tuve una entrada con ng-model ligado a un elemento en la matriz, y siempre que el modelo se actualizara, la entrada se difuminaría porque creo que el HTML se estaba re-renderizando. Una consecuencia del uso track by $index es que los elementos en la matriz con valores idénticos se repetirán. Si modificas uno que no sea el primero, sucederán cosas raras. Tal vez puedas filtrar por exclusividad para evitar eso.

Soy relativamente nuevo en AngularJS, así que por favor comenten si me falta algo grande. Pero esto funciona, así que lo estoy usando al menos.


2
2018-05-24 10:16



Otro método podría ser pasar el ámbito principal como una variable de ámbito a la directiva, es decir

<my-directive 
    md-parent-scope="this" 
    ng-repeat="item in items"></my-directive>

Es un poco complicado, pero tienes más control sobre lo que es el padre y puede pasar cualquier cosa.


2
2017-12-15 14:04