小编典典

推迟$ digest之后的angularjs监视执行(引发DOM事件)

angularjs

我有一块手表触发DOM事件:

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

问题是我有一个处理“ 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'); });
    }
});

到目前为止,此方法有效。这是处理此问题的正确方法吗?我不确定这是否能解决所有问题,并且想查看是否有一种角度认可的方法来在摘要之后延迟一段代码。

谢谢!


阅读 303

收藏
2020-07-04

共1个答案

小编典典

$超时通常就是用来运行一些经过消化周期(以及 之后
的浏览器呈现)。

$timeout执行该功能后,将导致另一个摘要循环被执行。如果您trigger不影响Angular,可以将invokeApply参数设置为false以避免运行另一个摘要循环。

如果要让回调在浏览器呈现 之前 运行:如果使用$evalAsync from指令对
代码进行排队,则应在Angular操作DOM之后但在浏览器呈现之前运行代码。但是,如果代码是使用$evalAsync _控制器_排队的,则它将在Angular操纵DOM之前(以及在浏览器呈现之前)运行。

2020-07-04