无法将Angular Factory数据导入Controller

时间:2016-06-16 02:22:51

标签: javascript angularjs

尝试从工厂获取数据并将其传递到控制器,然后用于ng-repeat。不知道为什么,但控制器永远不会运行工厂中建立的功能。

控制器

angular.module('myApp').controller('AppController',['$scope','ItemsFactory',
  function($scope,ItemsFactory){
    ItemsFactory.getItems(function(err, data){
      $scope.items = data;
      console.log('controller items', $scope.items);
    });
}]);

工厂

angular.module('myApp').factory('ItemsFactory', function($http){
    var getItems = function(){
      $http({
        method: 'GET',
        url: 'js/data/data.min.json'
      }).then(function success(response, data){
        var results = response.data;
        console.log('factory results', results);
      }, function error(response){
        console.log('error getting items');
      });
    };
    return{
      getItems: getItems
    };
});

跟随发布的其他几个例子,但似乎没有任何工作

结果由工厂返回,无法将其传递给控制器​​

修改

真诚地感谢大家的答案,因为他们都非常有用,工作并且对承诺和回调有很多启发。

决定使用@Fernando Fabreti的答案,因为它尽可能接近我所寻找的。

工厂

angular.module('myApp').factory('ItemsFactory', function($http){
    var getItems = function(callback){
      $http({
        method: 'GET',
        url: 'js/data/data.min.json'
      }).then(function success(response, data){
        var results = response.data;
        if(callback) callback(null, results);
      }, function error(response){
        console.log('error getting items');
      });
    };
    return{
      getItems: getItems
    };
});

控制器

angular.module('myApp').controller('AppController',['$scope','ItemsFactory',
  function($scope, ItemsFactory){

    ItemsFactory.getItems(function(err, data){
      $scope.items = data;
      console.log('controller items', $scope.items);
    });
}]);

3 个答案:

答案 0 :(得分:2)

你需要定义一个回调参数和" call"一旦得到结果就回调:

angular.module('myApp').factory('ItemsFactory', function($http){
    var getItems = function(cback){
      $http({
        method: 'GET',
        url: 'js/data/data.min.json'
      }).then(function success(response, data){
        var results = response.data;
        console.log('factory results', results);
        if (cback) cback(null, results); 
      }, function error(response){
        console.log('error getting items');
        if (cback) cback(response, null);
      });
    };
    return{
      getItems: getItems
    };
});

答案 1 :(得分:1)

你正在混淆这里调用方法的回调和承诺样式。您似乎想要将回调传递给getItems(getItems不带参数)并使用工厂的基于promise的结果(尽管您没有返回任何承诺)。

决定你想做什么。如果你想使用promise表单做这样的事情(为了简单起见):

ifac <- with(RawData,
   interaction(Participant,xVarCondition,Measure,drop=TRUE))
length(levels(ifac)) == nrow(RawData)

在你的控制器中用then或error函数做一些事情。

   var getItems = function(){
      return $http({
        method: 'GET',
        url: 'js/data/data.min.json'
      })
    };

答案 2 :(得分:1)

您应该使用从ItemsFactory.getItems().then(function(response) { $scope.items = response.data; }) .catch(function(response) { console.error('error', response.status, response.data); }) 返回的承诺,而不是使用回调。只需返回$http的结果,您就可以从中调用$http()来获取数据。

工厂:

.then()

控制器:

angular.module('myApp').factory('ItemsFactory', function($http){
    var getItems = function(){
      return $http({
        method: 'GET',
        url: 'js/data/data.min.json'
      }).then(function success(response){
        return response.data;
      }, function error(response){
        console.log('error getting items');
      });
    };
    return{
      getItems: getItems
    };
});