AngularJS $ timeout在计算值之前不等待UI-Router完成渲染

尼克·黄

我正在使用angularJSand requirejsviaangularAMD将一个复杂的应用程序连接在一起。

我的一个州有两个简单的视图,如下所示:

  $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 有一个指令:

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

view2有一些适用于造型的页面,包括更改样式表heightwidth该的view1容器。

在样式表修改DOM我希望函数linkFunctionAfterDomComplete计算元素的heightwidth属性,因此我将函数包装在view2linkFunctionAfterDomComplete$timeout()

尽管我们希望会在应用样式样式为from的情况下导致样式函数计算此元素的大小,并且从样式表样式修改元素的大小之前console.logcheckViewOneBoxWidth这里from会报告该元素的大小。DOM已完成。view2$timeoutlinkFunctionAfterDomCompleteview2

linkFunctionAfterDomComplete在元素完全渲染并应用了所有样式之后,如何计算出反映元素真实状态的元素属性?

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

tasseKATT

您需要将一个函数传递给$timeout

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

或者:

var fn = function () {
  console.log('timeout: view 1 linked');
};

$timeout(fn, 0);

以下:

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

console.log立即执行,然后将返回值(undefined)作为第一个参数传递给$timeout

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

不知道您的实际应用程序中是否存在相同的问题,但是我认为无论如何我都应该发布此问题。


基于编辑的新答案

问题是您的链接元素位于视图模板中,而不是位于index.html中。

如果将其移至index.html,它将按预期运行($timeout在这种情况下,您将不需要它,除非您的实际应用程序从指令中添加了自定义HTML):

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

如果将链接保留在视图模板中并保持超时,则基本上是这样:

  1. Angular将运行其编译功能以准备所有绑定和视图。
  2. 来自视图的HTML将插入到DOM中,指令将执行,并且console.log将被添加到超时队列中。
  3. 现在,link元素已插入DOM中,浏览器将开始检索CSS。console.log超时队列中in将执行。

请注意,CSS的获取是异步的,并且在CSSconsole.log的获取和解析完成之前,将执行超时队列中from。

另请注意,您可能会在不同的浏览器中看到不同的行为。

有解决方案,但可能会变得很混乱。

要了解更多信息:

何时真正加载样式表?

我建议只将链接移到index.html。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AngularJS ui-router 不渲染视图

来自分类Dev

AngularJs ui-router任务完成

来自分类Dev

AngularJS UI-Router:用子部分渲染父部分

来自分类Dev

继续之前的angularjs ui-router授权

来自分类Dev

在DOM完成渲染AngularJS之后运行指令

来自分类Dev

Angular ui-router:如何将模板渲染推迟到授权完成?

来自分类Dev

通过ng-route或angular-ui-router渲染不同的布局| AngularJS

来自分类Dev

AngularJS:避免使用$ timeout等待图像加载完成

来自分类Dev

AngularJS:避免使用$ timeout等待图像加载完成

来自分类Dev

AngularJS并使用$ timeout渲染模板

来自分类Dev

AngularJS并使用$ timeout渲染模板

来自分类Dev

在渲染Angularjs之前隐藏元素

来自分类Dev

在渲染Angularjs之前隐藏元素

来自分类Dev

angularjs承诺在显示消息之前等待3个服务完成

来自分类Dev

AngularJS ui-router:填写href值时,ui-sref链接不位于哈希之前

来自分类Dev

Material-UI自动完成渲染值

来自分类Dev

AngularJS等待数据渲染视图吗?

来自分类Dev

AngularJS:如何等待$ resource完成?

来自分类Dev

AngularJS->在DOM完成指令中的元素渲染时捕获

来自分类Dev

AngularJs渲染

来自分类Dev

需要在渲染模板之前不等待数据返回

来自分类Dev

需要在渲染模板之前不等待数据返回

来自分类Dev

AngularJS UI网格渲染超链接

来自分类Dev

在返回结果之前,nodejs不等待异步功能完成

来自分类Dev

在useEffect完成之前反应钩子渲染组件

来自分类Dev

在angularjs中使用ui-router

来自分类Dev

在angularjs ui-router中提交表单

来自分类Dev

测试angularjs ui-router go()方法

来自分类Dev

angularjs-ui.router兄弟状态