2013-07-23 57 views
59

是否有可能建立一個$watch裏面有服務對象的數組(我喜歡$watch聲明本身是裏面的服務)?

回答

120

通過注入$rootScope並使用函數第一個參數到$watch方法,您可以向該組表中添加任何表達式。僞代碼:

$rootScope.$watch(function() { 
    return //value to be watched; 
}, function watchCallback(newValue, oldValue) { 
    //react on value change here 
}); 

不要忘記關於$watch方法的第三個布爾參數。如果要深入觀察整個對象以進行更改,則需要指定true

+0

,如果你不介意的話,我想你笑w我們如何引用來自第一個函數的返回服務值。我盡我所能,但沒有成功觀察變化。一次又一次地返回同樣的價值。 – Birowsky

+0

@Birowsky你嘗試過'$ watchCollection'嗎? –

+0

因爲它正在監視整個應用程序的rootScope,所以這沒有幫助。 – btm1

15

服務其本質都是一樣的類和內部方法。你可以設置你從你的控制器誰的說法是範圍和適用的手錶式調用一個方法:

app.service('myservice',function(){ 
    this.listen = function($scope) { 
     $scope.$watch(function(){return someScopeValue},function(){ 
      //$scope.dosomestuff(); 
     }); 
    } 
}); 

//your controller 

function myCtrl($scope,myservice) { 
    $scope.listen = function() { 
     myservice.listen($scope); 
    } 

    //call your method 
    $scope.listen(); 
} 

更新:如果你想觀看服務中的私有局部變量,請參閱接受使用$ rootScope回答。如果您試圖在本地範圍內觀察$ scope變量,那麼這是您的最佳選擇。他們正在實現兩個完全不同的目標。

+0

這可能看起來像一個愚蠢的問題,但你爲什麼把'myservice.listen($ scope)'放在一個函數內?它是否容易在整個代碼中重用它,或者是否有一些重要的原因?另外,如果我把$ watch放在工廠裏,它還能工作嗎? –

0

你能澄清你想實現什麼?據我所知,你從服務器獲取一系列對象作爲你的模型。然後,它目前還不清楚:

  1. 你想驗證如果陣列中的一些對象已經改變 (也許因爲到服務器的最後一次通話的情況下,你做反覆 池)?
  2. 是否要驗證用戶是否已通過某些前端控制元素更改了陣列中的某些對象?

在情況1中,您並不真的需要使用$ watch(或者更確切地說$ watchCollection),但是您應該遍歷從服務器收到的數組並驗證更改(與$ watchColleciton相同)。如果對象與您當前擁有的對象不同,則在此元素上調用object。$ save()。

在第二種情況下,使用$ watchCollection()在$範圍,如果你把你在$ rootScope數組作爲參數傳遞給您的服務功能或使用$ rootScope。

我可以爲您提供真正的代碼,如果你能澄清的場景。

0

嘿剛剛有了一個情況,我對2個不同的控制器一個相當大的手錶設置。

因爲我不想重複我剛纔定義我的服務才能正常運行任何代碼:

angular 
    .module('invoice') 
    .factory('invoiceState', function() { 
     var invoice = { 
      client_info: { 
       lastname: "", 
       firstname: "", 
       email: "", 
       phone: "", 
       id_client: "", 
       ... 
      } 
     } 
     invoice.watchAccommodation = function (newVal, oldVal) { 
      var accommodation = newVal; 
      //Whatever you would normally have in your watch function 
     } 

然後我就可以調用這個函數中的任何控制器的手錶爲我注入了服務

function NewInvoiceCtrl(invoiceState) { 
    $scope.$watch('invoice.accommodation',invoiceState.watchAccommodation, true); 
} 

我沒有與AngularJS太多的經驗,所以我真的不能進入這個方法的性能方面,但它的工作原理;)