Javascript 预编译用于Google Maps标记的指令会导致“$apply ready in progress”错误

Javascript 预编译用于Google Maps标记的指令会导致“$apply ready in progress”错误,javascript,angularjs,google-maps,Javascript,Angularjs,Google Maps,我正在创建一个与谷歌地图集成的AngularJS应用程序。我有一些html用作信息弹出窗口。我在我的应用程序的其他地方使用了类似的html块,所以我开始使用一个指令来创建一个可重用的组件 一旦我实现了这一点,我意识到信息弹出窗口需要在创建时用html初始化,而不是在“弹出”时 我研究了如何预编译指令。它与AngularJS文档在测试指令方面非常相似 var element = angular.element("<my-directive data=data></my-direc

我正在创建一个与谷歌地图集成的AngularJS应用程序。我有一些html用作信息弹出窗口。我在我的应用程序的其他地方使用了类似的html块,所以我开始使用一个指令来创建一个可重用的组件

一旦我实现了这一点,我意识到信息弹出窗口需要在创建时用html初始化,而不是在“弹出”时

我研究了如何预编译指令。它与AngularJS文档在测试指令方面非常相似

var element = angular.element("<my-directive data=data></my-directive>");
var scope = $rootScope.$new();
scope.data = someData;
element = $compile(element)(scope);
scope.$apply();

element.html(); // Gives me the html 
这会导致错误“$apply ready in progress”,我知道这意味着一个摘要周期已经在进行中,但是这个$apply是必需的,因为我需要创建这个预编译模板以传递到我的信息弹出窗口

我已经研究了$interpolate和$parse,但我认为我不能使用它们,因为我的指令有需要评估的链接函数。

使用

if (!$scope.$$phase)
 $scope.$apply();

您可以在下面的代码中使用SafeApplyse,但不建议这样做


No正在寻找其他编译或使用隔离作用域的方法。我见过很多使用这种技巧的答案,但我不想这样做。嗯,是的,我在其他地方也看到过,但我想避免做任何作用域阶段检查。@user3406268我看不到您在代码中做任何asyc操作,那么为什么您需要作用域。$apply here。强制计算指令作用域表达式。请参阅此处的“测试指令”部分。您是否在测试中使用过ng app或angular.module?这发生在我的应用程序中,而不是我的测试套件中。我使用测试文档作为指导,因为它演示了如何“以编程方式”编译指令
$scope.safeApply = function(fn) {
  var phase = this.$root.$$phase;
  if(phase == '$apply' || phase == '$digest') {
    if(fn && (typeof(fn) === 'function')) {
      fn();
    }
  } else {
    this.$apply(fn);
  }
};