Eu tenho uma função no meu controlador angular, gostaria que essa função fosse executada em um documento pronto, mas notei que a angular a executa à medida que o dom é criado.
function myController($scope)
{
$scope.init = function()
{
// I'd like to run this on document ready
}
$scope.init(); // doesn't work, loads my init before the page has completely loaded
}
Alguém sabe como eu posso fazer isso?
javascript
angularjs
onload
foreyez
fonte
fonte
$document
para usá-lo.angular.element
Trabalha fora da caixa.document
é uma variável global em que, como$document
é injetável por angular, facilita o teste. Em geral, é difícil realizar aplicativos de teste unitário que acessam variáveis JS globais, como documento ou janela. Eu também acho quemodule.run
é um bom lugar para colocar esse código em vez do controlador.Veja este post Como executar a função do controlador angular no carregamento da página?
Para uma pesquisa rápida:
Dessa forma, você não precisa esperar até que o documento esteja pronto.
fonte
https://docs.angularjs.org/guide/bootstrap
Isso significa que o código do controlador será executado depois que o DOM estiver pronto.
Assim é justo
$scope.init()
.fonte
DOMContentLoaded
é acionado quando o documento foi completamente carregado e analisado, sem aguardar folhas de estilo, imagens e sub-quadros para concluir o carregamento. Para obter mais informações, consulte Qual é a diferença entre DOMContentLoaded e carregar eventos? .Angular tem vários pontos no tempo para começar a executar funções. Se você procura algo como o jQuery
Você pode achar esse analógico em angular muito útil:
Este é útil quando você deseja manipular os elementos DOM. Ele começará a executar somente depois que todos os elementos te forem carregados.
UPD: O que foi dito acima funciona quando você deseja alterar as propriedades do css. No entanto, às vezes não funciona quando você deseja medir as propriedades do elemento, como largura, altura, etc. Nesse caso, você pode tentar o seguinte:
fonte
Eu tive uma situação semelhante em que precisei executar uma função de controlador após o carregamento da exibição e também depois que um componente de terceiros específico da exibição foi carregado, inicializado e colocou uma referência a si mesmo no $ scope. O que acabou funcionando para mim foi configurar um relógio nessa propriedade de escopo e disparar minha função somente depois que ela foi inicializada.
O observador é chamado algumas vezes com valores indefinidos. Então, quando a grade é criada e possui a propriedade esperada, a função de inicialização pode ser chamada com segurança. Na primeira vez que o observador é chamado com um newValue não indefinido, oldValue ainda será indefinido.
fonte
Aqui está minha tentativa dentro de um controlador externo usando coffeescript. Funciona bastante bem. Observe que settings.screen.xs | sm | md | lg são valores estáticos definidos em um arquivo não uglificado que eu incluo no aplicativo. Os valores são de acordo com os pontos de interrupção oficiais do Bootstrap 3 para os tamanhos de consulta de mídia de mesmo nome:
fonte
A resposta
é o único que funciona na maioria dos cenários que testei. Em uma página de amostra com 4 componentes, todos construindo HTML a partir de um modelo, a ordem dos eventos foi
Portanto, um $ document.ready () é inútil na maioria dos casos, já que o DOM sendo construído em angular pode estar nem perto de pronto.
Porém, mais interessante, mesmo depois que o $ viewContentLoaded foi acionado, o elemento de interesse ainda não foi encontrado.
Somente após o $ timeout executado foi encontrado. Observe que, embora o tempo limite de $ tenha sido o valor 0, quase 200 milissegundos transcorreram antes de ser executado, indicando que esse encadeamento foi suspenso por um bom tempo, presumivelmente enquanto o DOM tinha modelos angulares adicionados em um encadeamento principal. O tempo total desde o primeiro $ document.ready () até a última execução do timeout $ foi de quase 500 milissegundos.
Em um caso extraordinário em que o valor de um componente foi definido e o valor de text () foi alterado posteriormente no tempo limite de $, o valor de tempo limite de $ teve que ser aumentado até que funcionasse (mesmo que o elemento pudesse ser encontrado durante o tempo limite de $ ) Algo assíncrono no componente de terceiros fez com que um valor tivesse precedência sobre o texto até que passasse tempo suficiente. Outra possibilidade é $ scope. $ EvalAsync, mas não foi tentada.
Ainda estou procurando aquele evento que me diz que o DOM se estabeleceu completamente e pode ser manipulado para que todos os casos funcionem. Até o momento, é necessário um valor de tempo limite arbitrário, o que significa, na melhor das hipóteses, que este é um argumento que pode não funcionar em um navegador lento. Eu não tentei opções JQuery como liveQuery e publique / assine, o que pode funcionar, mas certamente não é totalmente angular.
fonte
Se você estiver obtendo algo assim
getElementById call returns null
, provavelmente é porque a função está em execução, mas o ID não teve tempo de carregar no DOM.Tente usar a resposta de Will (na parte superior) com um atraso. Exemplo:
fonte
Por que não tentar com o que os documentos angulares mencionam https://docs.angularjs.org/api/ng/function/angular.element .
Eu usei isso dentro da minha função $ onInit () {...}.
Isso funcionou para mim.
fonte
fonte