【问题标题】:AngularJS $digest already in progressAngularJS $digest 已经在进行中
【发布时间】:2015-03-11 14:26:06
【问题描述】:

将数据加载到角度表达式时出现错误。数据已加载,但我收到错误 $digest 已在进行中。

var dom = angular.element($compile(template)($scope));
$scope.$apply();
var html = $('<div>').append(dom).html();

我会在这里给你我的模板的一小部分:

<b>Name: </b>{{model.project.description}}<br />
<b>Littera: </b>{{model.littera}}<br />
<b>Address: </b>{{model.address}}<br />

现在我尝试将 $scope.$apply() 包装到如下的 if 语句中。但我听说这是一个不好的方法。我猜没关系,因为它无论如何都没有用。

if (scope.$$phase) {
     scope.$apply();
}

它消除了错误,但现在数据绑定不起作用。现在输出是表达式而不是实际数据。 我也尝试将 $scope.$apply() 放入 $timeout 函数中,但同样,现在我们只得到表达式而不是数据。

此代码在指令中。我只给了你这段代码,因为指令中的其余代码在这里无关紧要。 我需要做些什么才能让数据绑定在仍然使用 $timeout 的情况下工作?

提前致谢。

编辑:我忘了说的一个重要部分是,我相信错误是针对 2 个为空的表达式。在 chrome 调试器中,它们未定义。

【问题讨论】:

  • 如果$compile 用于指令的链接阶段,我们不需要scope.$apply()。你有这方面的 plnkr/fiddle 吗?
  • $apply 接受一个函数作为它的第一个参数。它将运行该函数,然后调用$digest。为您的$compileappend(dom) 语句创建一个函数,并将其传递给$apply,然后您的数据应该会填充。 (详情:jimhoskins.com/2012/12/17/angularjs-and-apply.html
  • 我正在考虑为此做一个小提琴。但是这个指令对于我们使用它的角度谷歌地图来说是相当复杂的。所以把它拆下来让它在小提琴中工作似乎是一项艰巨的任务。我忘了说代码在承诺中。里面 .then(function(){})

标签: javascript jquery angularjs


【解决方案1】:

您是否考虑过以更兼容角度的方式实现指令,而不是自己处理 $apply?

当一段代码在 Angular 上下文之外执行时,通常会出现这类错误,例如 jquery 代码。

我会建议尽可能避免使用 jQuery 来编写你的指令。如果需要,请考虑使用链接功能。

【讨论】:

  • 好吧,代码在链接函数中。我们需要在这里使用 jQuery。无论如何,我们还没有找到更好的方法。除非你有一种角度的方式来编写 jQuery 行。
  • 我想最好重新考虑和重新设计您的视图和指令,而不是进行一些黑客攻击。这可能会帮助stackoverflow.com/questions/14994391/…
猜你喜欢
  • 2013-05-12
  • 1970-01-01
  • 2013-01-28
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
相关资源
最近更新 更多