在Angular中从工厂返回响应到控制器
Returning response from factory to controller in Angular
我有一个工厂通过api调用请求用户数据:
angular.module('MyApp')
.factory('UserApi', function($auth,Account){
return {
getProfile: function()
{
Account.getProfile()
.then(function(response){
return response.data; ----> returning json data ok!!
});
}
}
});
但是当我在控制器中调用函数时,它返回给我undefined
myApp.controller('AppCtrl', function($rootScope,$state,$window,$document,$scope,$filter,$resource,cfpLoadingBar,$translate,UserApi){
$scope.user = function(){
UserApi.getProfile().then(function(data){
$scope.currentUser = data;
})
}
console.log($scope.user()); ----> undefined
});
账户工厂:
angular.module('MyApp')
.factory('Account', function($http){
return {
getProfile: function(){
return $http.get('/api/me');
}
}
});
登录控制台的错误是TypeError: Cannot read property 'then' of undefined
编辑
唯一可行的解决方案是将response.data
设置为$rootScope.user
,这样数据将跨控制器可用。
angular.module('MyApp')
.factory('UserApi', function($auth,Account,$rootScope){
return {
getProfile: function()
{
Account.getProfile()
.then(function(response){
$rootScope.user = response.data; ----> returning json data ok!!
});
return $rootScope.user;
}
}
});
首先,getProfile
方法应该返回一个承诺(不像在你的代码中那样未定义):
angular.module('MyApp')
.factory('UserApi', function($auth,Account){
return {
getProfile: function()
{
return Account.getProfile()
.then(function(response) {
return response.data;
});
}
}
});
那么在控制器中你应该使用then
callback:
myApp.controller('AppCtrl', function ($rootScope, $state, $window, $document, $scope, $filter, $resource, cfpLoadingBar, $translate, UserApi) {
$scope.user = function () {
UserApi.getProfile().then(function (data) {
$scope.currentUser = data;
console.log($scope.currentUser);
})
};
});
还要确保您理解同步和异步代码之间的区别,以及为什么console.log($scope.user())
在这种情况下没有意义:当您尝试记录它时,如果还没有响应。相反,您提供一个回调,以便在数据到达时调用。
您试图在请求成功完成后返回数据。但是,由于这是一个ajax调用,我们不知道它何时会完成(基本上,在不同的线程上运行)。有两种方法可以解决这个问题。
1 -就像这样回电话。
angular.module('MyApp')
.factory('UserApi', function($auth,Account){
return {
getProfile: function(){
return Account.getProfile(); // return call and resolve in controller.
}
}
});
你可以使用promise ($q)
angular.module('MyApp')
.factory('UserApi', function($auth,Account, $q){
return {
getProfile: function(){
var deferred = $q.defer();
Account.getProfile()
.success(function(data){
deferred.resolve(data);
});
return deferred.promise; // just return the promise
}
}
});
,在你的控制器中只需要有以下内容:
myApp.controller('AppCtrl', function($rootScope,$state,$window,$document,$scope,$filter,$resource,cfpLoadingBar,$translate,UserApi){
$scope.user = function(){
UserApi.getProfile().then(function(data){
$scope.currentUser = data;
console.log($scope.currentUser);
});
}
});
EDITED:
得到undefined。因为:
-
$scope.user
中没有return
- 你的
console.log($scope.user($scope.user())
只在初始时间工作。 - 从
UserApi.getProfile()
获取数据有时间延迟 还有,你的代码有一些错误:
我可以建议:
- 不要使用
console.log($scope.user())
初始时间 - 或者,您应该获得工厂创建时的所有数据初始时间。然后,在控制器中使用
UserApi.data
。(但是,有时间延迟。如果请求在加载控制器之前返回响应,则可以获得成功数据。
.
angular.module('MyApp')
.factory('UserApi', function ($auth, Account) {
var data;
Account.getProfile().then(function (response) {
data = response.data;
});
return {
data: data
}
});
myApp.controller('AppCtrl', function ($rootScope, $state, $window, $document, $scope, $filter, $resource, cfpLoadingBar, $translate, UserApi) {
console.log(UserApi.data);
});
相关文章:
- Ember.js:将Em.$.getJSON转换为promise并将响应绑定到控制器上下文的正确方法
- RubyonRails环境控制器操作JavaScript响应
- 从 Zend 控制器传递值并在 JS 响应中获取它
- 如何在symfony2控制器中发送JSON响应
- 将响应标头从ngResource传递到控制器
- 从代码点火器控制器发送电子邮件后,无法在 jquery 中获取响应
- 在 Rails 中,我可以在 JS 响应后在控制器操作中执行 ActionMailer 逻辑吗?
- 哪个“控制器”在 JSON 中转换来自 .NET Web 服务的 XML 响应
- CodeIgniter - 如何从控制器返回 Json 响应
- 如何让角度控制器响应变量的值更改事件
- 无法读取角度.js控制器中的 json 响应属性
- 响应式模板的“棱角分明”方式?匹配媒体是否进入“控制器”
- 角度 JS 控制器没有响应
- 如何在jquery文件ulpload成功后从c#MVC控制器获得响应
- 如何向asp.net MVC 4控制器发送ajax请求以请求XML响应
- js.erb文件获胜't控制器中响应后的负载
- 来自form_for的控制器中的Ajax javascript响应以纯文本形式呈现
- Rails动态窗体远程真实控制器没有响应
- 在Angular中从工厂返回响应到控制器
- 在服务上发出http请求,在控制器中获得响应