Tengo un problema aparentemente simple sin una solución aparente (al leer los documentos de Angular JS) .
Tengo una directiva Angular JS que hace algunos cálculos basados en la altura de otros elementos DOM para definir la altura de un contenedor en el DOM.
Algo similar a esto está sucediendo dentro de la directiva:
return function(scope, element, attrs) {
$('.main').height( $('.site-header').height() - $('.site-footer').height() );
}
El problema es que cuando se ejecuta la directiva, $('site-header')
no se puede encontrar, devolviendo una matriz vacía en lugar del elemento DOM envuelto con jQuery que necesito.
¿Hay una devolución de llamada que pueda usar dentro de mi directiva que solo se ejecute después de que se haya cargado el DOM y pueda acceder a otros elementos del DOM a través de las consultas de estilo del selector de jQuery normal?
Respuestas:
Depende de cómo esté construido su $ ('site-header').
Puede intentar usar $ timeout con 0 retraso. Algo como:
Explicaciones de cómo funciona: uno , dos .
No olvide inyectar
$timeout
su directiva:fuente
$timeout
a la directiva. Doh. Todo funciona ahora, salud.$timeout
a una directiva como esta:.directive('sticky', function($timeout) { return function (scope, element, attrs, controller) { $timeout(function(){ }); }); };
Así es como lo hago:
fuente
element.ready(function(){
Probablemente el autor ya no necesite mi respuesta. Aún así, en aras de la integridad, creo que otros usuarios pueden encontrarlo útil. La mejor y más sencilla solución es utilizarla
$(window).load()
dentro del cuerpo de la función devuelta. (alternativamente puede usardocument.ready
. Realmente depende de si necesita todas las imágenes o no).Usar,
$timeout
en mi humilde opinión, es una opción muy débil y puede fallar en algunos casos.Aquí está el código completo que usaría:
fuente
hay un
ngcontentloaded
evento, creo que puedes usarlofuente
$ $window
está haciendo?Si no puede usar $ timeout debido a recursos externos y no puede usar una directiva debido a un problema específico con el tiempo, use broadcast.
Agregue
$scope.$broadcast("variable_name_here");
después de que se haya completado el recurso externo deseado o el controlador / directiva de larga ejecución.Luego agregue lo siguiente después de que se haya cargado su recurso externo.
Por ejemplo, en la promesa de una solicitud HTTP diferida.
fuente
Tuve un problema similar y quiero compartir mi solución aquí.
Tengo el siguiente HTML:
Problema: En la función de enlace de la directiva del div principal, quería consultar el div # sub secundario. Pero solo me dio un objeto vacío porque ng-include no había terminado cuando se ejecutó la función de enlace de la directiva. Entonces, primero hice una solución sucia con $ timeout, que funcionó, pero el parámetro de retardo dependía de la velocidad del cliente (a nadie le gusta eso).
Funciona pero sucio:
Aquí está la solución limpia:
Quizás ayude a alguien.
fuente