2013-08-29 119 views
1

我試圖從兩個單獨的控制器'控制'工廠中的數據,雖然下面的代碼工作正常,但它並不總是工作。無論出於何種原因,它只能約50%的時間綁定數據。有沒有辦法確保數據始終處於綁定狀態,並且是否有任何控制器對數據進行編輯,以使更改反映在兩端。AngularJS:用工廠控制服務數據

服務:

angular.module('service', ['ngResource']). 
    factory('Service', function($resource){ 
     return $resource('/api/data/:id', {id:'@id'}, {}); 
}); 

廠:

angular.module('factory', ['ngResource', 'service']). 
    factory('Factory', function($resource, Service) { 
     this.mydata = ''; 
     return { 
      getData: function(id){ 
      return Service.query({id: id}); 
      }, 

      data: function(data){ 
      return this.mydata; 
      }, 

      setData: function(data){ 
      this.mydata = data; 
      } 
     } 
}); 

控制器:

$scope.Factory = Factory; 
var items = Factory.getData(0); 

items.$promise.then(function(itemArr){ 

    var item = itemArr[0]; 
    $scope.data = item; 

    Factory.setData(item); 
}); 

如果有更好的方式來做到這一點,這樣我就不必設置工廠中的數據會很好。不必處理控制器中的promise對象也是很好的,但我認爲不可能在工廠中獲取數據。

使用上述工廠我用下面的代碼訪問它在不同的控制器設定數據後:

var item = Factory.data(); 
    $scope.selected = [{foo:'bar'},{foo1:'bar1'}]; 

    angular.forEach($scope.selected, function(value, key){ 
     item.requirements.push(value); 
    }) 

    Factory.setData(item); 

最終我希望能夠從兩個控制器訪問相同的變化的數據。以上的作品,但只有一些時間,我不知道什麼是沒有設置。

編輯: 我可以通過在回調函數的控制器中使用$scope.$watch功能來使它一直工作。數據是綁定的,但角度需要知道如何在下面的答案中建議要注意什麼。

回答

0

要不用手動設置在「工廠」的數據(也稱爲角服務),你可以將其設置在回調到資源:

return { 
      getData: function(id){ 
       return Service.query({id: id}, function(data){ 
       myData = data; 
       }); 
      }, 

如果你想不與處理承諾對象,你可以在自己的到的getData函數回調發送和它完成時,叫你在資源的回調發送回調:

return { 
       getData: function(id, cb){ 
        return Service.query({id: id}, function(data){ 
        myData = data; 
        if (cb) {cb(data);} 
        }); 
       }, 

從而改變你打電話的getData的方式這個:

var items = Factory.getData(0, function(itemArr){ 
    var item = itemArr[0]; 
    $scope.data = item; 
}); 
+0

我切換控制器使用回調,以避免使用承諾對象,這是非常好的。然而,我無法在getData函數回調中設置this.mydata。錯誤很簡單,因爲我猜它不在範圍之內。你對如何設置這個有什麼想法嗎?我想這是爲什麼它只在某些時間工作的根源。 –

+0

嘗試丟失'this'並僅引用myData。在Factory服務中聲明'var myData =「」'。 – BoxerBucks

+0

我遇到了同樣的問題,它是未定義的。我不確定爲什麼這個變量將無法從成功回調中獲得,但事實並非如此。 –

相關問題