因此,我对此提出了一些解决方案,但我仍然不太确定什么是最好的。首先供参考,我可以找到一个类似的问题,尽管它有点旧了。这是供稍后阅读本文的任何人使用的:观察 Angular 中的尺寸变化 https://stackoverflow.com/questions/19048985/angularjs-better-way-to-watch-for-height-change
The Goal
我的应用程序中有一些部分需要响应式高度元素。我想要以最快、最具视觉吸引力的方式在 UI/指令层执行此操作,而不需要显式广播更改事件。
选项一:指令
一个简单的指令可以记录每个摘要循环的尺寸(和调整大小事件)
return {
scope: {
size: '=ngSize'
},
link: function($scope, element, attrs) {
var windowEl = angular.element($window),
handler = function() {
if ($scope.size &&
element.outerWidth() === $scope.size.width &&
element.outerHeight() === $scope.size.height) return false;
$scope.size = {
width: element.outerWidth(),
height: element.outerHeight()
};
};
windowEl.on('resize', function() {
$scope.$apply(handler);
});
$root.$watch(function() { return [element.outerWidth(), element.outerHeight()] }, handler, true);
}
};
Problem:这种变化传播得不够快,视觉滞后很明显。
解决方案:使用间隔调用
选项二:$interval
我用 $interval 调用尝试了同样的事情,它起作用了,但 CPU 使用率出人意料地高,即使在我反转控制并跟踪按值监视的简单根集合中的元素之后(避免由指令的多个实例产生并发计时器) )。
除了我的环境中一些与 GC 相关的问题(我目前没有看到任何表明这一点的问题)之外,是否有更好的方法来创建这种流体布局?
提议的解决方案/问题
我的第一个想法是创建一个并发的 $digest 循环,以有效地监控整个 DOM 的任何视觉变化。是否可以有效地迭代所有计算样式,例如,生成可以按值监视的廉价哈希值?每次添加和/或更改相关的计算样式时都可以相对便宜地触发某些东西?
在我构建和分析它之前,有人可以评论一下它是否现实,或者首先抽象/重构调整大小触发器是否更有意义?
关于实现此目标的首选方式的任何其他想法1.2.9?
[edit] 另一个可能更简单的问题:是否有可能通过 Javascript 以计算高效的方式提供 1-200 毫秒的实际刷新率?如果是这样,那是 Angular 的 $interval,还是“VanillaJS”实现会更有效?