Eu tenho um problema aparentemente simples, sem solução aparente (lendo a documentação Angular JS) .
Eu tenho uma diretiva Angular JS que faz alguns cálculos com base na altura de outros elementos DOM para definir a altura de um contêiner no DOM.
Algo semelhante a isso está acontecendo dentro da diretiva:
return function(scope, element, attrs) {
$('.main').height( $('.site-header').height() - $('.site-footer').height() );
}
O problema é que, quando a diretiva é executada, $('site-header')
não pode ser encontrada, retornando um array vazio em vez do elemento DOM empacotado do jQuery de que preciso.
Existe um retorno de chamada que eu possa usar dentro da minha diretiva que só é executado depois que o DOM foi carregado e eu posso acessar outros elementos do DOM por meio das consultas de estilo do seletor jQuery normais?
Respostas:
Depende de como seu $ ('cabeçalho do site') é construído.
Você pode tentar usar $ timeout com 0 atraso. Algo como:
Explicações de como funciona: um , dois .
Não se esqueça de injetar
$timeout
em sua diretiva:fonte
$timeout
para a diretiva. Doh. Tudo funciona agora, saúde.$timeout
para uma diretiva como esta:.directive('sticky', function($timeout) { return function (scope, element, attrs, controller) { $timeout(function(){ }); }); };
É assim que eu faço:
fonte
element.ready(function(){
Provavelmente o autor não precisará mais da minha resposta. Ainda assim, para sermos completos, acho que outros usuários podem considerá-lo útil. A melhor e mais simples solução é usar
$(window).load()
dentro do corpo da função retornada. (como alternativa, você pode usardocument.ready
. Realmente depende se você precisa de todas as imagens ou não).Usar,
$timeout
na minha humilde opinião, é uma opção muito fraca e pode falhar em alguns casos.Aqui está o código completo que eu usaria:
fonte
há um
ngcontentloaded
evento, acho que você pode usá-lofonte
$ $window
está fazendo?Se você não pode usar $ timeout devido a recursos externos e não pode usar uma diretiva devido a um problema específico de tempo, use broadcast.
Adicione
$scope.$broadcast("variable_name_here");
após a conclusão do recurso externo desejado ou do controlador / diretiva de longa duração.Em seguida, adicione o seguinte depois que seu recurso externo for carregado.
Por exemplo, na promessa de uma solicitação HTTP adiada.
fonte
Eu tive um problema semelhante e quero compartilhar minha solução aqui.
Eu tenho o seguinte HTML:
Problema: Na função de link da diretiva do div pai, eu queria jquery'ing o div filho # sub. Mas ele apenas me deu um objeto vazio porque o ng-include não tinha terminado quando a função de link da diretiva foi executada. Então, primeiro fiz uma solução suja com $ timeout, que funcionou, mas o parâmetro de atraso dependia da velocidade do cliente (ninguém gosta disso).
Funciona mas está sujo:
Aqui está a solução limpa:
Talvez ajude alguém.
fonte