Angular.js: ng-repeat track por $index con directiva personalizada

Creado en 15 nov. 2017  ·  3Comentarios  ·  Fuente: angular/angular.js

Estoy enviando un...

  • [ ] informe de error
  • [ ] solicitud de función
  • [X] otro

Comportamiento actual:

Después del filtrado y la matriz que se repite y tiene una directiva personalizada en cada elemento repetido que tiene un alcance aislado. La directiva personalizada no se reinicia.

Supongo que este es el comportamiento esperado, pero puede ser confuso y debe quedar más claro en cuanto a lo que puede hacer poner track by $index en sus directivas personalizadas.

Comportamiento esperado / nuevo:
N / A

Reproducción mínima del problema con instrucciones:

  1. cree ng repeat con una directiva personalizada dentro (incluya seguimiento por $index)
  2. usando $filter en la matriz de repetición, filtre la matriz y notará que los datos en la directiva no reflejarán la nueva matriz filtrada

Versión de AngularJS: 1.5.10

Navegador: todos

Algo más:

¿Podrían los documentos ser más claros entre lo que está haciendo Angular cuando usa track by y que usar $index con directivas personalizadas no va a funcionar?

Verifique mi respuesta aquí para ver un desglose del problema.
https://stackoverflow.com/a/47310734/2536454

ngRepeat docs

Comentario más útil

Creo que este es el comportamiento esperado. Citando los documentos :

Cuando se reordenan los elementos, sus respectivas plantillas se reordenan en el DOM.

Para minimizar la creación de elementos DOM, ngRepeat usa una función para "realizar un seguimiento" de todos los elementos de la colección y sus elementos DOM correspondientes. Por ejemplo, si se agrega un elemento a la colección, ngRepeat sabrá que todos los demás elementos ya tienen elementos DOM y no los volverá a procesar.

En tales casos (cuando se usa track by $index ), el elemento DOM n siempre coincidirá con el elemento n de la matriz, por lo que los enlaces en ese elemento no se actualizarán incluso cuando cambie el elemento correspondiente, lo que esencialmente causará el vista para desincronizarse con los datos subyacentes.

Poniéndolo todo junto, lo que sucede es que el seguimiento por $index le dice a ngRepeat que el primer elemento es siempre el mismo (ya que tiene el mismo índice). ngRepeat no sabe que los datos subyacentes han cambiado, porque usted le dice que mientras el índice sea el mismo, el elemento es el mismo (en la práctica, el seguimiento por $index rara vez es útil) .

Dado que ngRepeat indica que el elemento es el mismo, no volverá a crear el DOM, sino que mantendrá el existente (vinculado al alcance existente, etc.). Y, por lo tanto, las directivas que aparecen en la plantilla no se volverán a compilar (ya que la compilación/vinculación ocurre solo cuando se "elimina" una nueva instancia).

Pero admito que no estamos haciendo un muy buen trabajo explicando eso en los documentos :grin:
@michael-letcher, ¿le interesaría enviar un PR para mejorar los documentos?

Todos 3 comentarios

¿Hay alguna posibilidad de que puedas ser un poco más específico (o proporcionar una muestra de reproducción)?
Puede comenzar desde este plunkr para reproducir el problema, ya que parece funcionar bien para mí.

https://plnkr.co/edit/dxzgjmE5MEA0bwQdckVS?p=preview

Creo que este es el comportamiento esperado. Citando los documentos :

Cuando se reordenan los elementos, sus respectivas plantillas se reordenan en el DOM.

Para minimizar la creación de elementos DOM, ngRepeat usa una función para "realizar un seguimiento" de todos los elementos de la colección y sus elementos DOM correspondientes. Por ejemplo, si se agrega un elemento a la colección, ngRepeat sabrá que todos los demás elementos ya tienen elementos DOM y no los volverá a procesar.

En tales casos (cuando se usa track by $index ), el elemento DOM n siempre coincidirá con el elemento n de la matriz, por lo que los enlaces en ese elemento no se actualizarán incluso cuando cambie el elemento correspondiente, lo que esencialmente causará el vista para desincronizarse con los datos subyacentes.

Poniéndolo todo junto, lo que sucede es que el seguimiento por $index le dice a ngRepeat que el primer elemento es siempre el mismo (ya que tiene el mismo índice). ngRepeat no sabe que los datos subyacentes han cambiado, porque usted le dice que mientras el índice sea el mismo, el elemento es el mismo (en la práctica, el seguimiento por $index rara vez es útil) .

Dado que ngRepeat indica que el elemento es el mismo, no volverá a crear el DOM, sino que mantendrá el existente (vinculado al alcance existente, etc.). Y, por lo tanto, las directivas que aparecen en la plantilla no se volverán a compilar (ya que la compilación/vinculación ocurre solo cuando se "elimina" una nueva instancia).

Pero admito que no estamos haciendo un muy buen trabajo explicando eso en los documentos :grin:
@michael-letcher, ¿le interesaría enviar un PR para mejorar los documentos?

qué

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

ashclarke picture ashclarke  ·  3Comentarios

jetta20162 picture jetta20162  ·  3Comentarios

brijesh1ec picture brijesh1ec  ·  3Comentarios

kishanmundha picture kishanmundha  ·  3Comentarios

visnup picture visnup  ·  3Comentarios