Estoy enviando un...
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:
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
¿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í.
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é
Comentario más útil
Creo que este es el comportamiento esperado. Citando los documentos :
Poniéndolo todo junto, lo que sucede es que el seguimiento por
$index
le dice angRepeat
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?