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()

console.logcheckViewOneBoxWidth这里报告这种元素的大小,从样式表的样式之前view2,此元素的修改尺寸尽管我们预期$timeout造成linkFunctionAfterDomComplete功能从造型后,计算出该元素的大小view2应用和DOM已完成。

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

UI在渲染前不等待值

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

AngularJS并使用$ timeout渲染模板

来自分类Dev

angularjs ui.router

来自分类Dev

在渲染Angularjs之前隐藏元素

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Flutter 的 WidgetTester.pumpAndSettle() 不等待渲染完成?

来自分类Dev

如何使componentDidMount()在渲染之前完成

来自分类Dev

如何使用angularjs等待诺言完成返回值

来自分类Dev

Material-UI自动完成渲染值

来自分类Dev

AngularJS-等待多个资源查询完成

来自分类Dev

等待AngularJs Ajax调用完成

来自分类Dev

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

来自分类Dev

ReactJs:如何在渲染之前等待componentDidMount()完成?

来自分类Dev

在React渲染之前等待多个异步调用完成

来自分类Dev

AngularJs渲染

来自分类Dev

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

来自分类Dev

AngularJS UI网格渲染超链接

来自分类Dev

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

来自分类Dev

在继续循环之前不等待条件完成的函数

来自分类Dev

如何使Angular动画等待渲染完成

来自分类Dev

react-router在更改路线之前不等待动画

来自分类Dev

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

来自分类Dev

componentWillMount在渲染之前未完成

来自分类Dev

在获取数据之前完成渲染组件

Related 相关文章

热门标签

归档