2015-07-13 176 views
1

即使觀察/觀察值沒有改變,我也想觸發所有$ watch/$觀察者。這樣我就可以提供「僅測試」功能來刷新當前頁面/視圖而無需用戶交互。我嘗試過打電話給$ apply/$ digest但是沒有工作:

$timeout(function(){ 
    $scope.$apply(); 
}); 

$timeout(function(){ 
    $scope.$digest(); 
}); 

有沒有其他方法可以做到這一點?下面

此致

回答

1

執行$scope.$apply()將觸發消化週期,因爲它內部調用$digest,是例如手動改變。

number變量不會被綁定,因爲超時會使其脫離角度範圍。

setTimeout(function() { 
    $scope.number = Math.random(); 
}); 

但是你可以 「強制」,它通過手動應用範圍的變化顯示:

setInterval(function() { 
    $scope.$apply(); 
}, 100); 

演示: No change/Change with manual updates

這不會引發觀察家雖然。從$digest實現中,它會檢查自上次觀看評估以來值是否發生了更改,並且僅在有回調時纔會運行回調。

IF((值= watch.get(當前))!= =(最後= watch.last)...... [rootScope.js]

因此,您需要以某種方式改變最後執行的價值,有可能通過$$watchers對象做的範圍:

$scope.digest = function() { 
    setTimeout(function() { 
     angular.forEach($scope.$$watchers, function (w) { 
      w.last.value = Math.random(); 
     }); 

     $scope.$apply(); 
    }); 
} 

DEMO

+0

OK,下面以實例爲plnkr:http://plnkr.co/edit/vDjIdGER66Fo2g6qCsDo?p=preview 用戶選擇選項後,指令日誌選擇選項到控制檯(通過$觀察),現在,當用戶點擊刷新鏈接時,指令應該記錄相同的選項。 – Sassa

+0

請檢查我的更新回答'$ scope。$ apply()'將觸發摘要循環,觀察者將被重新評估,但是隻有在自上次執行後觀察表達式值發生變化時纔會調用其回調函數。不確定如何觸發它們 –

+0

那麼所有觀察值的時間變化如何,然後將它們還原? – Sassa

0

如何使用$emit函數然後用$on函數捕獲該事件?

$emit()事件函數調用中,事件從子範圍向上冒泡到父範圍。觸發事件的範圍之上的所有範圍都將收到有關事件的通知。 我們使用$emit()當我們想要在我們的應用程序內溝通狀態變化的應用程序的其餘部分。

_.bind($scope.$emit, $scope, 'myCustomEvent'); 

然後在捕獲階段:

$scope.$on('myCustomEvent', function() {        
    // do something 
}); 
+0

不幸的是,我不能添加自定義事件。基本上我需要添加全局刷新按鈕/鏈接,而無需更改任何代碼。這就是爲什麼我想到觸發$ watch/$觀察。這裏是一個plnkr:http://plnkr.co/edit/vDjIdGER66Fo2g6qCsDo?p =預覽示例代碼。 – Sassa