已应用已在进行中错误

时间:2013-05-05 09:37:40

标签: javascript angularjs

我目前正在使用

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

2 个答案:

答案 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服务的第三个参数。这对你目前的情况可能非常有帮助。