AngularJS:Controller将Factory的$ http响应记录为" undefined"

时间:2016-05-12 19:38:34

标签: angularjs angular-http angular-controller

我希望我的$ http响应数据可供控制器使用,以便通过指令(" {{hint}}")在视图中显示JSON数据。然而,虽然在控制器中,我可以从工厂记录数据,但数据不会以可用的方式提供自身。

当工厂提供的内容记录在控制器中时,它是"未定义"或者"不是功能"。从下面的代码," undefined"已记录"

请帮我纠正我的错误?如何清理它,以便在控制器中使用工厂的.GET数据?

控制器:

var MainCtrl = angular.module('MainCtrl', []);

MainCtrl.controller('Ctrl2', [ "QuizViewServ", '$log', '$scope',
function(QuizViewServ, $log, $scope){


 $scope.init = function(){
    $scope.hint = "FooBar";  //Testing binding bw Ctrl2 & the view
    $log.log(QuizViewServ.getQuizData.quizQz); // <-LOGS AS "UNDEFINED"
 }

}]);

厂:

var MainServ = angular.module('MainServ', []);

MainServ.factory('QuizViewServ', ['$http', function($http){
 console.log("factory working");

 var getQuizData = function(){

   $http({
      method: 'GET',
      url: '/assets/json.json'
    }).then(function successCallback(response) {
        console.log("inside successgul GET req");


        var quizQz;
        quizQz = response.data.quizQs;
        console.log(quizQz);


    }, function errorCallback(response) {

        alert("Trouble grabbing requested data.")
    });
  }
  return {
    getQuizData : getQuizData
  }

}]);

2 个答案:

答案 0 :(得分:1)

$ http 使用promises返回结果。使用QuizViewServ.getQuizData.quizQz时,您没有记录任何内容,因为它是异步的。

在您的工厂中,退回承诺,并在您的控制器中处理它。

var MainServ = angular.module('MainServ', []);

MainServ.factory('QuizViewServ', ['$http', function($http){
 console.log("factory working");

 var getQuizData = function(){

   return $http({
      method: 'GET',
      url: '/assets/json.json'
    })
  }
  return {
    getQuizData : getQuizData
  }

}]);

并在您的控制器中

var MainCtrl = angular.module('MainCtrl', []);

MainCtrl.controller('Ctrl2', [ "QuizViewServ", '$log', '$scope',
function(QuizViewServ, $log, $scope){


 $scope.init = function(){
    $scope.hint = "FooBar";  //Testing binding bw Ctrl2 & the view

    QuizViewServ.getQuizData().then(function(result){
        $log.log(result.data);
    });
 }

}]);

答案 1 :(得分:0)

您需要重新启动该数据。你不可能做到这一点。 quizQz财产也是私有财产。即使在ajax调用之后设置了该值,也无法访问它。

var getQuizData = function(){

return $http({
  method: 'GET',
  url: '/assets/json.json'
}).then(function successCallback(response) {
    console.log("inside successgul GET req");


    var quizQz;
    quizQz = response.data.quizQs;
    console.log(quizQz);
    return quizQz;

  }, function errorCallback(response) {

    alert("Trouble grabbing requested data.")
    return '';
});

}

在控制器中,获取这样的数据。

QuizViewServ.getQuizData().then(function(data){
    console.log(data);
});