我有一块手表触发DOM事件:
scope.$watch(function() { return controller.selected; }, function(selected) { if (selected) { $input.trigger('focus'); } });
问题是我有一个处理“ focus”的处理程序scope.$apply。
scope.$apply
$input.bind('focus', function() { scope.$apply(function() { controller.focused = true; }); });
因此,当我$watch从内部触发时$digest,会导致错误,因为它尝试触发另一个$digest。
$watch
$digest
我要解决的方法是将触发器放入中$timeout。
$timeout
scope.$watch(function() { return controller.selected; }, function(selected) { if (selected) { $timeout(function() { $input.trigger('focus'); }); } });
到目前为止,此方法有效。这是处理此问题的正确方法吗?我不确定这是否能解决所有问题,并且想查看是否有一种角度认可的方法来在摘要之后延迟一段代码。
谢谢!
$超时通常就是用来运行一些经过消化周期(以及 之后 的浏览器呈现)。
$timeout执行该功能后,将导致另一个摘要循环被执行。如果您trigger不影响Angular,可以将invokeApply参数设置为false以避免运行另一个摘要循环。
trigger
invokeApply
false
如果要让回调在浏览器呈现 之前 运行:如果使用$evalAsync from指令对 代码进行排队,则应在Angular操作DOM之后但在浏览器呈现之前运行代码。但是,如果代码是使用$evalAsync _控制器_排队的,则它将在Angular操纵DOM之前(以及在浏览器呈现之前)运行。
$evalAsync