AngularJS的数据流问题

时间:2014-03-25 00:06:11

标签: javascript angularjs factory

我在一个指令中有一个函数来进行查询(并根据控制台获取结果)。问题是我似乎无法将这些结果存储到工厂中,并将它们传递给控制器​​。

这是指令:

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都返回一个空数组。我错过了什么吗?

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

对这里有角度的工厂存在误解。您正在尝试设置dataService =,这将无法正常工作。

正如Mohammad所提到的,你需要在工厂中设置一个超出你的返回值的变量集,返回值基本上是一个具有允许你操作常量的函数的对象。所以你需要的是一个getter" getItems()"获取项目,以及setter" addItem(item)"用于将项目添加到项目数组中。

所以你永远不会直接注射你的"物品"进入一个控制器,你会注入一堆可以获取或操纵你的物品的功能。

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);
  });
}