gpt4 book ai didi

angularjs - 在 $digest 之后延迟 angularjs 监视执行(引发 DOM 事件)

转载 作者:行者123 更新时间:2023-12-03 08:53:28 25 4
gpt4 key购买 nike

我有一个触发 DOM 事件的 watch :

scope.$watch(function() { return controller.selected; }, function(selected) {
if (selected) {
$input.trigger('focus');
}
});

问题是我在“焦点”上有一个处理程序,它执行 scope.$apply .
$input.bind('focus', function() {
scope.$apply(function() { controller.focused = true; });
});

所以当我的 $watch$digest 内部发射它会导致错误,因为它试图触发另一个 $digest .

我的解决方法是将触发器放在 $timeout 中。 .
scope.$watch(function() { return controller.selected; }, function(selected) {
if (selected) {
$timeout(function() { $input.trigger('focus'); });
}
});

这有效......到目前为止。这是处理这个问题的正确方法吗?我不确定这是否适用于所有情况,并且想看看是否有 Angular 认可的方式在摘要之后延迟一段代码。

谢谢!

最佳答案

$timeout通常是用于在摘要循环之后运行某些内容(以及 在浏览器呈现 之后)。
$timeout将导致函数执行后执行另一个摘要循环。如果您的 trigger不影响任何Angular,你可以设置invokeApply false 的参数以避免运行另一个摘要循环。

如果您希望您的回调运行 之前 浏览器呈现:如果代码使用 $evalAsync 排队从指令中,它应该在 Angular 操作 DOM 之后,但在浏览器呈现之前运行。但是,如果代码使用 $evalAsync 排队从 Controller 开始,它将在 Angular 操作 DOM 之前(以及在浏览器呈现之前)运行。另见 https://stackoverflow.com/a/17303759/215945 .

关于angularjs - 在 $digest 之后延迟 angularjs 监视执行(引发 DOM 事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16066239/

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