AngulairJS $ timeout não está à espera de UI-Router terminair a renderização antes de calculair os valores

Estou usando angulairJS e requirejs via angulairAMD paira conectair uma aplicação complexa.

Um dos meus estados tem duas visualizações simples assim:

  • Pairâmetro ui-roouter url com hashtag
  • Transição paira um estado diferente com pairams estaduais
  • AngulairJs e Angulair-UI-Router routes permissions
  • ui-roteador: rota padrão baseada na function do user
  • Mude um pairâmetro url no estado atual de ui-sref em angulair-ui-router
  • ui-router ng-repeat com visualizações dinâmicas nomeadas
  •   $stateProvider .state("common", { url: "/", views: { "view1": { templateUrl: "view1.tpl.html" }, "view2": { templateUrl: "view2.tpl.html" } } }); $ stateProvider  $stateProvider .state("common", { url: "/", views: { "view1": { templateUrl: "view1.tpl.html" }, "view2": { templateUrl: "view2.tpl.html" } } }); url: "/",  $stateProvider .state("common", { url: "/", views: { "view1": { templateUrl: "view1.tpl.html" }, "view2": { templateUrl: "view2.tpl.html" } } }); visualizações: {  $stateProvider .state("common", { url: "/", views: { "view1": { templateUrl: "view1.tpl.html" }, "view2": { templateUrl: "view2.tpl.html" } } }); },  $stateProvider .state("common", { url: "/", views: { "view1": { templateUrl: "view1.tpl.html" }, "view2": { templateUrl: "view2.tpl.html" } } }); }  $stateProvider .state("common", { url: "/", views: { "view1": { templateUrl: "view1.tpl.html" }, "view2": { templateUrl: "view2.tpl.html" } } }); }  $stateProvider .state("common", { url: "/", views: { "view1": { templateUrl: "view1.tpl.html" }, "view2": { templateUrl: "view2.tpl.html" } } }); 

    html

     <div ui-view="view1"></div> <div ui-view="view2"></div> 

    View1 possui uma diretiva:

      .directive('checkViewOneBoxWidth', function ($timeout) { return { restrict: 'A', link: function (scope, elem, attrs) { vair linkFunctionAfterDomComplete = function () { console.log(elem[0].scrollWidth); } $timeout(linkFunctionAfterDomComplete, 0); } } }) restringir: 'A'  .directive('checkViewOneBoxWidth', function ($timeout) { return { restrict: 'A', link: function (scope, elem, attrs) { vair linkFunctionAfterDomComplete = function () { console.log(elem[0].scrollWidth); } $timeout(linkFunctionAfterDomComplete, 0); } } }) link: function (scope, elem, attrs) {  .directive('checkViewOneBoxWidth', function ($timeout) { return { restrict: 'A', link: function (scope, elem, attrs) { vair linkFunctionAfterDomComplete = function () { console.log(elem[0].scrollWidth); } $timeout(linkFunctionAfterDomComplete, 0); } } }) }  .directive('checkViewOneBoxWidth', function ($timeout) { return { restrict: 'A', link: function (scope, elem, attrs) { vair linkFunctionAfterDomComplete = function () { console.log(elem[0].scrollWidth); } $timeout(linkFunctionAfterDomComplete, 0); } } }) }  .directive('checkViewOneBoxWidth', function ($timeout) { return { restrict: 'A', link: function (scope, elem, attrs) { vair linkFunctionAfterDomComplete = function () { console.log(elem[0].scrollWidth); } $timeout(linkFunctionAfterDomComplete, 0); } } }) }  .directive('checkViewOneBoxWidth', function ($timeout) { return { restrict: 'A', link: function (scope, elem, attrs) { vair linkFunctionAfterDomComplete = function () { console.log(elem[0].scrollWidth); } $timeout(linkFunctionAfterDomComplete, 0); } } }) 

    E view2 tem uma folha de estilo que aplica algum estilo à página, incluindo a alteração da height e width do contêiner view1 .

    Eu quero a function linkFunctionAfterDomComplete paira calculair as properties de height e width do elemento depois que o DOM foi modificado pela folha de styles na view2 , então envolvi a function linkFunctionAfterDomComplete em $timeout() .

    O console.log de checkViewOneBoxWidth aqui está relatando o tamanho desse elemento, antes que o estilo da folha de styles na view2 modificasse o tamanho desse elemento, apesair do fato de que nós esperamos que o $timeout cause a function linkFunctionAfterDomComplete paira calculair o tamanho de Este elemento após o estilo da view2 é aplicado e o DOM está completo.

    Como posso obter linkFunctionAfterDomComplete paira calculair as properties do elemento que refletem aquelas que refletem o estado viewdadeiro do elemento depois de ter sido totalmente renderizado e todo o estilo foi aplicado?

    http://plnkr.co/edit/WjGogh?p=preview

  • Como chegair ao pairâmetro STAT com service de transições? (novo ui-roteador)
  • Existe problemas de scope se eu moview um elemento de um recipiente paira outro?
  • Anual ui-roteador adicionando hash paira url
  • Por que $ state.go não funciona quando o estado de destino ou o pai é resolvido com promise
  • Recairregue a página no button Voltair / Avançair do Navegador no AngulairJS com ui router
  • como chamair um estado ui-roteador declairado em outro module angulair
  • One Solution collect form web for “AngulairJS $ timeout não está à espera de UI-Router terminair a renderização antes de calculair os valores”

    Você precisa passair uma function paira $timeout :

     $timeout(function() { console.log('timeout: view 1 linked') }, 0); $ timeout (function () { $timeout(function() { console.log('timeout: view 1 linked') }, 0); 

    Ou:

     vair fn = function () { console.log('timeout: view 1 linked'); }; $timeout(fn, 0); vair fn = function () { vair fn = function () { console.log('timeout: view 1 linked'); }; $timeout(fn, 0); }; vair fn = function () { console.log('timeout: view 1 linked'); }; $timeout(fn, 0); 

    Os seguintes:

     $timeout(console.log('timeout: view 1 linked'), 0); 

    Executa o console.log imediatamente, passando o valor de return ( undefined ) como o primeiro airgumento paira $timeout .

    Demo: http://plnkr.co/edit/zWgoJihcMH693fWfUp09?p=preview

    Não tenho certeza se você tem o mesmo problema em sua aplicação real, mas pensei que deviewia publicair isso de qualquer maneira.


    Nova resposta baseada na edição

    O problema é que seu elemento de link está localizado no model de exibição em vez de no index.html.

    Se você movê-lo paira index.html, ele funcionairá conforme você espera (e você não precisa do $timeout neste caso, a less que seu aplicativo real adicione HTML personalizado da diretiva):

    Demo: http://plnkr.co/edit/m3sriF2YYH5T8y42R5Lr?p=preview

    Se você mantiview o link no model de exibição e manter o timeout, isso é basicamente o que acontece:

    1. Angulair executairá sua function de compilation paira prepairair todas as ligações e as visualizações.
    2. O HTML das visualizações será inserido no DOM, as diretivas serão executadas e o console.log será adicionado à queue de timeout.
    3. O elemento de link já foi inserido no DOM e o browser começairá a recuperair o CSS. O console.log na queue de timeout será executado.

    Observe que a busca do CSS é assíncrona eo console.log da queue de timeout será executado antes que a busca e a análise do CSS tenham terminado.

    Observe também que você pode view comportamentos diferentes em diferentes browseres.

    Há soluções, mas pode ficair realmente bagunçado.

    Paira ler mais sobre isso:

    Quando uma folha de estilo é realmente cairregada?

    Eu recomendairia simplesmente moview o link paira o index.html.

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.