De hecho, debe usar directivas, y no hay ningún evento vinculado al final de un ciclo ng-Repeat (ya que cada elemento se construye individualmente y tiene su propio evento). Pero a) usar directivas podría ser todo lo que necesita yb) hay algunas propiedades específicas de ng-Repeat que puede usar para hacer que su evento "on ngRepeat finalice".
Específicamente, si todo lo que desea es diseñar / agregar eventos a toda la tabla, puede hacerlo utilizando una directiva que abarque todos los elementos ngRepeat. Por otro lado, si desea abordar cada elemento específicamente, puede usar una directiva dentro de ngRepeat, y actuará en cada elemento, después de que se haya creado.
Entonces, hay el $index
, $first
, $middle
y $last
propiedades que se pueden utilizar para eventos de activación. Entonces para este HTML:
<div ng-controller="Ctrl" my-main-directive>
<div ng-repeat="thing in things" my-repeat-directive>
thing {{thing}}
</div>
</div>
Puede usar directivas así:
angular.module('myApp', [])
.directive('myRepeatDirective', function() {
return function(scope, element, attrs) {
angular.element(element).css('color','blue');
if (scope.$last){
window.alert("im the last!");
}
};
})
.directive('myMainDirective', function() {
return function(scope, element, attrs) {
angular.element(element).css('border','5px solid red');
};
});
Véalo en acción en este Plunker . ¡Espero eso ayude!
myMainDirective
el código se ejecute solo después del final del ciclo? Necesito actualizar la barra de desplazamiento del padre div.Si simplemente desea ejecutar algo de código al final del ciclo, aquí hay una variación un poco más simple que no requiere manejo adicional de eventos:
Vea una demostración en vivo.
fuente
No es necesario crear una directiva, especialmente solo para tener un
ng-repeat
evento completo.ng-init
hace la magia por tiel
$last
se asegura de quefinished
solo se dispara cuando el último elemento se ha presentado al DOM.No te olvides de crear
$scope.finished
evento.Feliz codificación !!
EDITAR: 23 oct 2016
En caso de que también desee llamar a la
finished
función cuando no hay ningún elemento en la matriz, puede usar la siguiente soluciónSimplemente agregue la línea anterior en la parte superior del
ng-repeat
elemento. Verificará si la matriz no tiene ningún valor y llamará a la función en consecuencia.P.ej
fuente
Aquí hay una directiva de repetición que llama a una función específica cuando es verdadera. Descubrí que la función llamada debe usar $ timeout con intervalo = 0 antes de realizar la manipulación DOM, como inicializar información sobre herramientas en los elementos renderizados. jsFiddle: http://jsfiddle.net/tQw6w/
En $ scope.layoutDone, intente comentar la línea $ timeout y descomente el mensaje "¡NO CORRECTO!" línea para ver la diferencia en la información sobre herramientas.
JS:
fuente
Aquí hay un enfoque simple
ng-init
que ni siquiera requiere una directiva personalizada. Me funcionó bien en ciertos escenarios, por ejemplo, la necesidad de desplazar automáticamente un div de elementos repetidos por ng a un elemento particular en la carga de la página, por lo que la función de desplazamiento debe esperar hasta que elng-repeat
renderizado termine en el DOM antes de que pueda dispararse.Tenga en cuenta que esto solo es útil para las funciones que necesita llamar una vez después de que la ng-repeat se muestre inicialmente. Si necesita llamar a una función cada vez que se actualizan los contenidos de ng-repeat, entonces tendrá que usar una de las otras respuestas en este hilo con una directiva personalizada.
fuente
Complementando la respuesta de Pavel , algo más legible y fácilmente comprensible sería:
¿Por qué crees que
angular.noop
hay en primer lugar ...?Ventajas:
No tiene que escribir una directiva para esto ...
fuente
ng-init="$last && doSomething( )"
Tal vez un enfoque un poco más simple con
ngInit
eldebounce
método de Lodash sin la necesidad de una directiva personalizada:Controlador:
Modelo:
Actualizar
Incluso hay una solución AngularJS pura más simple que usa un operador ternario:
Modelo:
Tenga en cuenta que ngInit utiliza la fase de compilación previa al enlace, es decir, la expresión se invoca antes de que se procesen las directivas secundarias. Esto significa que aún puede ser necesario un procesamiento asincrónico.
fuente
ng-init="$last ? refresh() : false"
, también funcionaría. Y eso ni siquiera requiere Lodash.También puede ser necesario cuando marca la
scope.$last
variable para ajustar su disparador con unsetTimeout(someFn, 0)
. AsetTimeout 0
es una técnica aceptada en javascript y era imprescindible para midirective
ejecutar correctamente.fuente
Esta es una mejora de las ideas expresadas en otras respuestas para mostrar cómo obtener acceso a las propiedades ngRepeat ($ index, $ first, $ middle, $ last, $ even, $ impar) cuando se usa la sintaxis declarativa y el alcance de aislamiento ( Google recomienda las mejores prácticas) con una directiva de elemento. Tenga en cuenta la diferencia principal:
scope.$parent.$last
.fuente
Lo hice de esta manera.
Crea la directiva
Después de agregarlo en la etiqueta donde esta ng-repeat
Y listo con eso se ejecutará al final de la repetición ng.
fuente
Mi solución fue agregar un div para llamar a una función si el elemento fue el último en una repetición.
fuente
Me gustaría agregar otra respuesta, ya que las respuestas anteriores suponen que el código necesario para ejecutarse después de que se realiza ngRepeat es un código angular, que en ese caso todas las respuestas anteriores dan una solución excelente y simple, algunas más genéricas que otras, y en caso de que sea importante la etapa del ciclo de vida del resumen, puede consultar el blog de Ben Nadel al respecto, con la excepción de usar $ parse en lugar de $ eval.
pero en mi experiencia, como dice el OP, generalmente ejecuta algunos complementos o métodos JQuery en el DOM finalmente compilado, que en ese caso encontré que la solución más simple es crear una directiva con un setTimeout, ya que la función setTimeout se empuja hasta el final de la cola del navegador, siempre es justo después de que todo se hace en angular, generalmente ngReapet que continúa después de la función de enlace posterior de sus padres
para quien se pregunte que en ese caso por qué no usar $ timeout, es que causa otro ciclo de digestión que es completamente innecesario
fuente
Tuve que renderizar fórmulas usando MathJax después de que ng-repeat finaliza, ninguna de las respuestas anteriores resolvió mi problema, así que hice lo siguiente. No es una buena solución , pero funcionó para mí ...
fuente
He encontrado una respuesta aquí bien practicado, pero aún así era necesario añadir un retraso
Cree la siguiente directiva:
Agréguelo a su repetidor como un atributo, así:
Según Radu ,:
Para mí funciona, pero aún necesito agregar un setTimeout
fuente
Si simplemente desea cambiar el nombre de la clase para que se represente de manera diferente, el siguiente código sería suficiente.
Este código funcionó para mí cuando tuve un requisito similar para mostrar el artículo comprado en mi lista de compras en letra Strick.
fuente