我目前正在使用
scope.onFocus = function(){ // change scope variables
};
elem.bind('focus', function(){
scope.$apply('onFocus()')});
绑定到指令的link函数中的焦点事件。
问题是如果我像这样手动激活焦点事件:{ - 1}}在说ng-click处理程序中,我将得到“正在进行中”错误。
是否需要检查是否已调用apply:elem.focus()
?
在致电申请之前,是否将其视为“Angularic”?
还有其他优雅的解决方案吗?
更新:
这是我的解决方案:
由于if (! scope.$$phase)
可以触发外部事件(Angular之外),而外部事件又可以调用scope.onFocus
,因此您将“正在应用已经在进行中”错误。诀窍是分别致电$apply
。
$apply
答案 0 :(得分:0)
您可以使用指令执行此操作,例如:
myapp.directive('onfocus', function() {
return {
restrict: 'A',
scope: {
onfocus:'=onfocus'
},
link:function (scope, element, iAttrs, controller){
element.bind('focus', function(event) {
scope.onfocus();
});
}
};
});
您的观点
<input type="text" onfocus="onFocus()" />
和你的控制器
scope.onFocus = function(){ // change scope variables
};
答案 1 :(得分:0)
老实说,如果你处于竞争状态,我最好的建议就是你需要以不应该发生的方式组织代码,如果它仍然存在,那么代码就会出现问题。 $$阶段是一个内部实现,Angular用它来检查当前摘要周期的当前状态。使用$$阶段不是未来安全的,你应该避免使用它。
堆栈跟踪对竞争条件非常有帮助。它实际上解释了正在产生比赛的那个时刻正在运行的其他周期。
有一些复杂的情况,例如额外的API调用,它同时作为异步和sycn(成为缓存的同步原因),您应该尝试处理它并使API以单一方式运行。
尝试详细阅读$ timeout / $ interval,$ apply / $ digest和ngModel / ngModelController($ render / $ setViewValue)。另外仔细查看传递给$ timeout / $ interval服务的第三个参数。这对你目前的情况可能非常有帮助。