【问题标题】:Error: $apply already in progress错误:$apply 已在进行中
【发布时间】:2014-05-25 11:45:25
【问题描述】:

我在我的 Angular UI 手风琴上使用了这个 http://plnkr.co/edit/sqXVCJ?p=preview。我已经将指令属性放在锚上(在模板中),并且我已经覆盖了模板以删除 ng-click="isOpen = !isOpen" 并将其替换为函数调用“callSubmit”。所有的手风琴都加载了视图,所有的视图也都有表单。 callSubmit 函数的目的是提交可以正常工作但我收到上述错误的表单。

我已经阅读了有关添加 $timeout 服务(不起作用)和添加安全应用方法的各种帖子,这给了我递归和摘要错误。

我不确定我还能尝试什么,该功能工作正常,但我只是不断收到该错误。

!--- button
<button type="submit" class="btn btn-default hidden" id="btnSubmit_step1" ng-click="submitForm()">Trigger validation</button>

!-- function

     $scope.callSubmit = function() {

       document.getElementById('btnSubmit_step1').click();

     };

编辑:我一直从控制器触发按钮单击的原因是表单方法在另一个范围和不同的控制器中。

因此,如果我使用来自 rootScope 的广泛广播,如下所示。我将广播事件毫无问题地发送到另一个控制器。接收广播的控制器在其范围内具有表单,但是当我尝试执行该功能时,我什么也没得到,根本没有表单提交。

$$scope.callSubmit = function() {           
  //document.getElementById('btnSubmit_step1').click();
 $rootScope.$broadcast('someEvent', [1,2,3]);
};


$scope.$on('someEvent', function(event, mass) {
 $scope.submitForm();
});

【问题讨论】:

  • 为什么要点击按钮而不是调用按钮点击的角度函数?

标签: angularjs angularjs-directive angular-ui


【解决方案1】:

不要点击控制器上的按钮。

$scope.callSubmit = function() {
   $scope.submitForm();
};

文档很清楚...

不要使用控制器来:

操纵 DOM — 控制器应该只包含业务逻辑。 将任何表示逻辑放入控制器会显着影响 它的可测试性。 Angular 对大多数情况和指令都有数据绑定 封装手动 DOM 操作。

单击页面上的按钮正在操作 DOM。

【讨论】:

  • 我这样做的原因是提交表单功能在另一个控制器中。与我想执行表单提交的控制器共享表单控制器提交方法的最佳方式是什么?我想我使用服务并分享方法吧?
  • 是的,我会将通用功能添加到服务中,并将其注入到每个控制器中。我还创建了一些辅助模块,它们不是服务,但包含将在控制器中重复的代码。
  • 考虑到由于手风琴,我的范围内有多个表单,我将如何单独提交每个表单?
  • 我不确定您的意思,但您可以使用带有type="submit" 的按钮和表单元素上的ng-submit 指令来处理表单提交。
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 2015-04-08
  • 2023-03-28
  • 2014-03-18
  • 2013-05-03
  • 2013-01-28
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多