2014-08-27 57 views
0

我有角以下服務:

myModule.factory("myService", function(){ 
    return { 
     data: [], 

     updateData: function(data){ 
     this.data = data; 
     } 
    } 
}); 

我也有一個指令和控制其使用這項服務:

myModule.controller("myController", ['$scope', 'myService', function($scope, myService){ 
    this.directiveOptions = {data: myService.data, someOtherData: null}; 
}); 

myModule.directive("myDirective", function(){ 
    return { 
      scope: { 
       options: "=" 
      }, 
      link: function(scope, element, attrs){ 
       scope.$watch('options.data', function(newData){ 
        alert("data was changed"); 
       }); 
      } 
     }; 
}); 

HTML:

<div ng-controller="myController as ctrl"> 
    <my-directive options="ctrl.directiveOptions"></my-directive> 
</div> 

在我稱之爲 「了updateData」(服務)的應用程序的一些點。手錶正在調用,但我得到的newData是舊數據。

我可以想出一個解釋,爲什麼手錶根本無法工作,但無法解釋其當前行爲。有任何想法嗎?

+0

你碰巧得到這個工作? – acg 2014-08-27 21:52:11

回答

0

的exlpanation很簡單,讓我們解決它一步一步:

  1. 首先創建myService.data陣列。我們來調用這個數組A1。
  2. 然後創建控制器並設置this.directiveOptions.data = myService.data = A1
  3. 然後myService.updateData()被調用,myService.data數組接收到一個新值A2。

看到問題了嗎?

this.directiveOptions.data is still「指向」(以C語言)給A1。它無法知道其實際收到的來源A1形式發生了變化。

兩個,我能想到的解決方案:

  1. myService.updateData()應該更新同一陣列,例如截斷,並用新的數據填充它:

    updateData: function(data){ 
        this.data.length = 0; 
        for(var i=0; i < data.length; i++) { 
         this.data[i] = data[i]; 
        } 
    } 
    
  2. 控制器$watch(myService.data)並採取相應的行動:

    // inside the controller 
    var self = this; 
    $scope.$watch(
        function() { return myService.data; }, 
        function(newval) { 
         self.directiveOptions.data = newval; 
        } 
    ); 
    
+0

這就是我的想法,我實際上擁有與您所建議的相同的解決方案。我只是不確定這是一個很好的解決方案。它感覺有點黑客 – 2014-08-31 08:23:56

0

我認爲這個問題可能圍繞做了深刻的手錶運轉,如果數據是一個數組,可以通過幾種方式處理:

scope.$watch('options.data', function(newData){ 
        alert("data was changed"); 
       }, true); <--passing in true calls deep watches 

或者更好地觀察數據公司選擇使用$ watchCollection