就像标题所说,我不明白为什么在指令的链接功能中操作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>
答案 0 :(得分:3)
需要超时以允许从最后的angularjs摘要周期完成DOM操作。如果没有这个,你就不会看到身高,文字,风格,班级等方面的任何变化。
此外,如果您没有在超时后包含时间,则在摘要完成后立即发生超时。有一个案例是我们需要在此之外访问并使用了未记录的功能$$ postDigest,这使我们能够从摘要中收集数据而不包括浏览器事件。
答案 1 :(得分:0)
在角度中存在消化周期,这通常是由DOM操作引起的,该操作使用绑定进行注释,这导致页面的页面/部分重绘。 当您执行与angular的内部机制无关的操作时,框架不知道应该启动摘要循环,因此您有时需要明确告诉它这样做。