2015-10-30 89 views
0

我在一個角度控制器運行一個大任務,我有一些觀察員可以在代碼執行之間觸發,並且由於性能改進,我不希望發生這種情況。角運行功能,然後申請

我該如何避免代碼運行時角度觸發一些觀察者?這是否已經在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()}); 

謝謝。

+3

然後不看它 – webduvet

+0

我需要,因爲我aplication的構建的守望者,問題是,如果有任何辦法阻止摘要和執行時你希望在 –

+0

之後有一段時間我建議在開始搞亂摘要循環之前,對你正在觀察的變量進行排序。 – webduvet

回答

0

你可以嘗試把它放到$timeout服務與0超時

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

看看到第三個參數$timeout服務,它不應該叫$apply(),但需要事後稱自己

0

在你的情況我覺得,而不是一個觀察者$emit$broadcast會更適合你,所以你有直接控制何時發送事件。

而且是你可以取消綁定和重新綁定觀察家......雖然他們切換是相當罕見的,是不是這樣的偉大實踐

有一個函數添加一個觀察者:

var addWatcher = function(name){ 
return $scope.$watch(name...) 
} 
如果你想

觀察者做一些事情只是給觀察者添加一個回調,以便它可以做某些事情; 與調用它:

var mywatcher = addWatcher('scopeName'); 

禁用觀察者電話:

myWatcher(); 

類似的東西

0

JavaScript不運行在相同常任務,因爲一個aplication的角部位是什麼也可以在Javascript下運行,那麼你不必擔心它,因爲觀察者不會被觸發,直到你正在執行的函數結束。

閱讀更多關於Javascript事件循環和角度$摘要和$應用來理解這一點。

https://docs.angularjs.org/guide/scope(與瀏覽器事件循環集成)