角度运行函数,然后应用

Angular run function and then apply

本文关键字:然后 应用 函数 运行      更新时间:2023-09-26

我正在angular中的控制器中运行一个大任务,我有一些观察程序可能会在代码执行期间触发,由于性能的提高,我不希望发生这种情况。

在代码运行时,我如何避免角度触发某些观察程序?这已经在角魔法内部处理了吗?这个问题可以用$q解决吗,或者有更好的方法来解决?

示例:

$scope.variableThatKeepsChanging = {};
function someVeryLongFuntion(){
  var someVar = variableThatKeepsChanging;
  (...);
}
$scope.clickedFn = function () {
  //Here should start someVeryLongFuntion()
  someVeryLongFuntion();
  //Only now should be run the $apply() function of angular 
}
//NOTE: I need the watcher to catch changes not done by someVeryLongFuntion()
$scope.$watch('variableThatKeepsChanging', function () {doSomething()});

谢谢。

您可以尝试使用0超时将其放入$timeout服务

$timeout(function(
    someVeryLongFunction();
), 0, false);

看看$timeout服务中的第三个参数,它不应该调用$apply(),但之后您需要自己调用

在您的情况下,我觉得$emit$broadcast更适合您,而不是观察者,因此您可以直接控制何时发送事件。

但是的,你可以解除绑定和重新绑定观察者。。。尽管切换它们是相当罕见的,并且不是一个很好的做法

具有添加观察程序的功能:

var addWatcher = function(name){
return $scope.$watch(name...)
}

如果你想观察者做某事,只需向观察者添加一个回调,它就会做某事;调用:

var mywatcher = addWatcher('scopeName');

禁用观察程序调用:

myWatcher();

类似的东西

Javascript不在parallel中运行任务,由于应用程序的角度部分也在Javascript下运行,因此您不必担心,因为在执行的函数结束之前,观察者不会被触发。

阅读更多关于Javascript事件循环以及angular$digest和$apply的信息,了解这一点。

https://docs.angularjs.org/guide/scope(与浏览器事件循环集成)