Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS的数据流问题_Javascript_Angularjs_Factory - Fatal编程技术网

Javascript AngularJS的数据流问题

Javascript AngularJS的数据流问题,javascript,angularjs,factory,Javascript,Angularjs,Factory,我在指令中有一个函数,用于进行查询(并根据控制台获取结果)。问题是,我似乎无法将这些结果存储到工厂,并将其传递给控制器 这是指令: scope.getVersions = function(release) { if (angular.isUndefined(release)) return; musicInfoService.getReleaseVersions(release.id) .success(function(data) {

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

这是指令:

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

但是items和$scope.versions都返回一个空数组。我遗漏了什么吗?

您真的应该使用备份字段来存储数据,并使用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);
}

人们对这里正在进行的角度工厂有一种误解。您正在尝试设置dataService=,这将永远不会起作用

正如Mohammad提到的,您需要在工厂中的返回值之外设置一个变量,并且返回值基本上是一个对象,其函数允许您操作常量。因此,您需要一个getter“getItems()”来获取项目,一个setter“addItem(item)”来将项目添加到项目数组中

所以你从来没有直接将你的“项目”注入控制器,你注入了一堆可以获取或操作你的“项目”的函数


嗨,Mohammad,我已经尝试了你的代码,但是回来了ReferenceError:数据服务没有定义。1秒钟,让我做一个简单的解释,我会给你我的,差不多finished@EricMitjans这是因为您没有将
dataService
注入指令构造函数,请执行以下操作:
app.directive('release',['musicInfoService','dataService',function(musicInfoService,dataService){
我再也看不到该plunk中未定义的错误,您能粘贴控制台中得到的确切错误吗?
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);
  });
}