为什么在修改角度的dom时需要超时

时间:2015-09-03 19:52:57

标签: angularjs

就像标题所说,我不明白为什么在指令的链接功能中操作DOM时我需要$ timeout。

以下代码有效。 有问题的元素是1x1 div,它包含视频插件的容器。 如果我删除$ timeout,则元素不会调整大小并且不可见。 删除$ timeout并用$ rootScope替换它。$ apply()不起作用。没有等待的ajax调用。我只是想在用户操作上调整元素大小。

我的问题是超时时间实际上是任意的,并且在较旧的计算机上运行的旧浏览器上我需要1500ms范围内的更大超时值,这大约有90%的时间。即使1500毫秒也是荒谬的,我当然不想让它更大。

var containerBoundingBox;
$timeout(function () {
  containerBoundingBox = element[0].getBoundingClientRect();
  $log.warn('containerBoundingBox: ', containerBoundingBox);
  getActiveVideoElement().css({
    'position': 'fixed',
    'z-index': 1000000,
    'top': containerBoundingBox.top + 'px',
    'left': containerBoundingBox.left + 'px',
    'width': containerBoundingBox.width + 'px',
    'height': containerBoundingBox.height + 'px'
  });
}, 100);

元素代码取自实时页面: 这是div我调整的不是对象标签。

<div id="pluginContainer"
     class="pluginContainer ng-scope ng-isolate-scope"
     style="position: fixed; top: 1px; left: 1px; width: 1px; height: 1px; z-index: 1000000;">
    <object type="application/x-xxxx"
            id="xxxxxPlugin"
            style="width: 100%; height: 100%;"
    ></object>
</div>

2 个答案:

答案 0 :(得分:3)

需要超时以允许从最后的angularjs摘要周期完成DOM操作。如果没有这个,你就不会看到身高,文字,风格,班级等方面的任何变化。

此外,如果您没有在超时后包含时间,则在摘要完成后立即发生超时。有一个案例是我们需要在此之外访问并使用了未记录的功能$$ postDigest,这使我们能够从摘要中收集数据而不包括浏览器事件。

答案 1 :(得分:0)

在角度中存在消化周期,这通常是由DOM操作引起的,该操作使用绑定进行注释,这导致页面的页面/部分重绘。 当您执行与angular的内部机制无关的操作时,框架不知道应该启动摘要循环,因此您有时需要明确告诉它这样做。