2014-04-09 58 views
0

我已經搜索過高和低,嘗試了很多'解決方案',並且無法正確地觀看服務。

服務:

self = {}; // or self = this; 
self.testVar = null; 

$interval(function() { 
    self.testVar = Math.random(); 
}, 1000); 

return self; 

控制器:

$scope.testVar = myService.testVar; 
$scope.$watch('testVar', function(newVal, oldVal) { 
    console.log(newVal, oldVal); 
}) 

此代碼不能正常工作。我想避免使用$廣播,因爲它看起來像角度應該神奇地處理服務更新。任何見解都值得讚賞。


編輯:解決方案控制器:

$scope.$watch(
    function() { return myService.testVar }, 
    function(newVal) { 
     console.log(newVal); 
    } 
) 

如果有人在乎解釋這種行爲,這將有利於那些遇到同樣的問題。


經進一步調查,改變$間隔計時器爲100ms仍然導致控制器印刷到每這表明$範圍。$ 1000毫秒的手錶被設定爲1秒的最大速率控制檯。我想這是最好的使用從服務中設定$ scope.testVar $廣播或觀察者/回調方法,而不是O_O

回答

0
$scope.testVar = myService.testVar; 
$scope.$watch('testVar', function(newVal, oldVal) { 
    console.log(newVal, oldVal); 
}) 

在這段代碼。然後你看着它。沒有什麼改變它。在你的「解決方案」中,它是有效的,因爲你正在觀看服務中的「實時」價值。您不需要使用$ broadcast或observer或callbacks。在您觀看服務價值和更新範圍時,這將按預期工作。

+0

「當您正在觀看服務價值並更新範圍時,這將按預期工作。」它並沒有。如果我直接像$ scope.watch('myService.value',...)那樣觀察服務值,則什麼都不會發生...... – user3516621

+0

當您將字符串作爲第一個參數傳遞給它時,它期望它是該範圍的屬性。如果要使用服務中的值,則需要傳遞一個函數作爲第一個參數,並返回服務調用中的值。 – aet