2016-05-12 46 views
0

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

当控制器记录了工厂提供的内容时,它是“未定义”或“不是功能”。从下面的代码,“不确定”登录”

请帮助我的权利我的过错如何清理这件事,这样才能在控制器使用工厂。获得数据

控制器:??

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 
    } 

}]); 
+0

阅读http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

+0

@JBThis是一个伟大的文章。谢谢。 –

+0

....他拼写“小马”,寿。 :-/ 哈。 –

回答

1

$ HTTP使用承诺返回结果当使用QuizViewServ.getQuizData.quizQz你LO因为它是异步的,所以什么也没有。

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

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

}]); 
+0

这确实有用。正是你刚才提到的原因,我忽略了。然而,这是否意味着迭代JSON文件对象的“业务逻辑”必须留在Controller中?为了“清洁”,这个逻辑应该保存在服务中吗? ---我不是在质疑你的答案,我真的很好奇。 –

+0

这取决于您是否需要对返回的数据进行不同的处理。如果每个使用它的控制器都有一定的独特性,那么应该在控制器内部完成。如果多个控制器需要相同的数据,那么使用@Zohaib Ijaz的解决方案在工厂进行数据处理,它们都是有效的:P因此,基本上,您可以选择两种方式,取决于场景和个人偏好 –

+0

Gotcha。这完全有道理。是的,我已经尝试过你和@Zohaib Ijaz的解决方案。正如你所说,他们都在不同的情况下工作。谢谢。 –

0

你需要retrun数据。这是不可能的,因为你在做。 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); 
}); 
+0

您不能在承诺中返回数据,您需要将其分配给在该承诺之外声明的变量,或者返回该对象以处理承诺未来。我的答案是从promis中检索数据的正确方法。返回返回promis的函数并处理它。 :http://stackoverflow.com/questions/26854654/get-data-out-of-a-promise-instead-of-returning-a-promise –

+0

我在我的生产应用程序中使用角度,我知道,我们可以返回数据,但我错过了在$ http() –

+0

之前添加return语句然后,您将不得不从$ getQuizData()看结果,如果它的情况看起来像不好的做法,我好奇你怎么做 –