gpt4 book ai didi

javascript - $digest 的调用不足以触发 $watch - AngularJs

转载 作者:行者123 更新时间:2023-11-28 06:18:33 25 4
gpt4 key购买 nike

我有一个 $watch 函数可以使元素垂直居中,因为我并不总是知道元素的高度和宽度。如果我在 $watch 函数之前的指令中有 $timeout,那么该函数就可以工作,这样 $digest 就可以为我的 调用足够的次数>$watch 当我的元素的高度或宽度在页面最终加载时发生变化时调用的函数。
但是,如果我从指令中删除 $timeout,通常不会调用 $watch,因为 $digest 循环不会在高度时发生或元素的宽度改变了。使用 $timeout 这通常会导致错误:"10 $digest() iterations reached. Aborting!"

有没有人知道另一种无需不断使用 $timeout 即可触发 $digest 循环的方法?或者有什么方法可以编辑我的 $watch 函数以使其正常运行?或者有什么我可以标记到我的元素上,以便它在加载时触发 $digest 循环吗?

这是我的指令:

angular.module('task2')
.directive('centerVertical', function ($timeout) {
return function (scope, element, attrs) {
scope.$watch(function () {
$timeout();
return {
'h': element[0].offsetHeight
};
},
function (newValue, oldValue) {
var elementHeight = newValue.h;

/*To account for rounding errors and not loop*/
if(elementHeight % 2 === 0)
{
element.css('margin-top', '-' + ((elementHeight) / 2) + 'px');
}
else
{
element.css('margin-top', '-' + ((elementHeight + 1) / 2) + 'px');
}
}, true);

element.bind('centerVertical', function () {
scope.$apply();
});
};
});

谢谢!

最佳答案

我找到了一种完全不使用 $watch 并在 DOM 加载后更新高度的方法。这很简单,我觉得以前没看到这个很傻。我希望这可以帮助那些像我一样花费数小时尝试做一些非常复杂的事情的人。

angular.module('task2')
.directive('centerElement', function ($timeout) {
return function (scope, element, attrs) {
angular.element(document).ready(function () {
element.css('margin-top', '-' + (element[0].offsetHeight / 2) + 'px');
element.css('margin-left', '-' + (element[0].offsetWidth / 2) + 'px');
});
};
});

关于javascript - $digest 的调用不足以触发 $watch - AngularJs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35745520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com