如何调用$scope$apply()仅当它's还没有进行中

How do I call $scope.$apply() only if it's not already in progress

本文关键字:进行中 还没有 apply 何调用 调用 scope      更新时间:2023-09-26

我正在AngularJS中构建一个应用程序。我的应用程序还使用了一个第三方javascript库,该库作用于如下div:

<div id="turn-me-into-a-slider"></div>

现在我实际上有几个这样的div,并使用ng重复来制作它们。所以它看起来更像这样:

<div id="sliders-container" ng-repeat="slider in sliders track by $index">
    <div id="slider-{{$index}}"></div>
</div>

现在,在我的代码中,当我想首先添加滑块时,我会向sliders数组添加一个新滑块。这应该传播到DOM中,然后我可以用id="slider-n"为div上的滑块运行初始化函数。这就是问题的根源。如果我在sliders数组上推送一个新值后立即放入滑块的初始化函数,DOM还没有更新,当调用滑块初始化器时,还没有具有正确id的DOM元素,初始化失败。如果我先调用$scope.$apply(),就会解决问题,但偶尔我会得到error, $scope.$apply() already in progress。有没有一种方法可以调用$scope$apply()是否仅在当前未运行时才能避免这种情况?如果你还有其他建议,我欢迎你。

试试这个:

setTimeout(function() {
  $scope.$apply(/**your function*/);
}, 1000);

这里有更多的解释:为什么要使用if(!$scope.$$phase)$scope$应用()反模式?