我正在角度控制器中运行一个大任务,我有一些观察者可以在执行代码之间触发,并且由于性能提高,我不希望这种情况发生。
在代码运行时,如何避免角度触发某些观察者?这已经在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 :(得分:0)
您可以尝试使用$timeout
超时
0
服务
$timeout(function(
someVeryLongFunction();
), 0, false);
查看$timeout
服务中的第三个参数,它不应该调用$apply()
,但您需要自己打电话
答案 1 :(得分:0)
在您的情况下,我觉得$emit
或$broadcast
代替观察者会更适合您,因此您可以直接控制何时发送事件。
但是,是的,你可以解除绑定并重新绑定观察者......虽然切换它们是相当不常见的,并不是一个很好的做法
具有添加观察者的功能:
var addWatcher = function(name){
return $scope.$watch(name...)
}
如果你想让观察者做某事只是给观察者添加一个回调,那么它会做一些事情; 称之为:
var mywatcher = addWatcher('scopeName');
禁用观察者呼叫:
myWatcher();
类似的东西
答案 2 :(得分:0)
Javascript不会在paralel中运行任务,并且因为应用程序的角度部分也是在Javascript下运行的,所以你不必担心它,因为观察者直到结束才会被触发你正在执行的功能。
详细了解Javascript事件循环和角度$ digest以及$ apply以了解这一点。
https://docs.angularjs.org/guide/scope(与浏览器事件循环集成)