javascript - array - ng-repeat select
Pasar el valor del alcance principal al bucle ng-repeat en Angular (3)
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.
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''];
Luego ng-repeat
vea así:
<div ng-repeat="item in obj.items | filter:''item3'' track by $index">
{{obj.items[ obj.items.indexOf(item) ]}}
</div>
(debe usar obj.items[ obj.items.indexOf(item) ]
lugar de obj.items[ $index ]
porque $index
es el índice de la matriz filtrada, no el original)
El motivo por el que esto funciona es porque mientras obj
no exista en el alcance actual, cuando intenta acceder a su propiedad, Angular se verá por encima del alcance actual en lugar de darle un error (si solo intentara {{obj}}
lo haría ser 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 ámbitos anidados: http://www.angularjshub.com/examples/basics/nestedcontrollers/
En mi caso, necesitaba la track by $index
, porque tenía una entrada con ng-model
vinculada a un elemento en la matriz, y siempre que el modelo se actualizaba, la entrada se difuminaba porque creo que el HTML se estaba re-renderizando. Una consecuencia de usar 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.
Otro método podría ser pasar el alcance 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.
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>