2014-03-25 47 views
0

我在一個指令內部有一個函數來進行查詢(並根據控制檯獲取結果)。問題是我似乎無法將這些結果存儲到工廠中,並將它們傳遞給控制器​​。AngularJS的數據流問題

這是指令:

scope.getVersions = function(release) { 
     if (angular.isUndefined(release)) return; 

     musicInfoService.getReleaseVersions(release.id) 
     .success(function(data) { 
      dataService = data.versions; 
      console.log(dataService); 
     }); 

}; 

控制檯顯示的DataService包含與結果的數組。 於是,我試着將它存儲到工廠:

app.factory('dataService', [function(){ 
    return { items: [] }; 
}]); 

,我把它叫做一個控制器:

function VersionController($scope, dataService) { 
    $scope.versions = dataService.items; 
    console.log($scope.versions); 
} 

但是這兩個項目和$ scope.versions回來一個空數組。我錯過了什麼?

回答

1

你真的應該使用支持字段來存儲數據,並使用setter和geter功能用於讀寫分別爲:

app.factory('dataService', [function(){ 
    var _items={}; 
    return { 
      setItems:function(value){ 
      _items=value; 
      }, 
      getItems:function(){ 
      return _items; 
      } 
    }; 
}]); 

和用於設置數據:

musicInfoService.getReleaseVersions(release.id) 
     .success(function(data) { 
      dataService.setItems(data.versions); 
      console.log(dataService); 
     }); 

和閱讀:

function VersionController($scope, dataService) { 
    $scope.versions = dataService.getItems(); 
    console.log($scope.versions); 
} 

See demo plunk.

+0

嗨穆罕默德,我試過你的代碼,但返回ReferenceError:dataService沒有定義。 –

+1

1秒,讓我做一個plunk –

+0

等等,我會給你我的,差不多完成 –

1

這裏有一個誤判角工廠。你正試圖設置dataService =,這將永遠不會工作。

正如穆罕默德所說,你需要有在工廠和返回值的返回值之外的變量集基本上是與功能,讓您操作您的常量的對象。所以你需要的是一個getter「getItems()」來獲取物品,一個setter「addItem(物品)」用於將物品添加到物品數組中。

所以你從來沒有直接注入你的「商品」到控制器,你注射一組函數,可以得到或操縱你的「項目」。

scope.getVersions = function(release) { 
     if (angular.isUndefined(release)) return; 

     musicInfoService.getReleaseVersions(release.id) 
     .success(function(data) { 
      dataService.addItem(data.versions); 
      console.log(dataService.getItems()); 
     }); 
}; 

app.factory('dataService', [function(){ 
    var items = []; 
    return { 
    addItem: function(item) { 
     items.push(item); 
    }, 
    getItems: function() { 
     return items; 
    } 
    }; 
}]); 

function VersionController($scope, dataService) { 
    $scope.$watch(dataService.getItems, function(items) { 
    $scope.versions = items; 
    console.log($scope.versions); 
    }); 
}