AngularJs factory调用$http服务到controller拿不到数据

殷小强 2015-08-12 12:08:06
是关于一个angularjs的问题,版本1.4.3
在controller里调用$http调用api,可以顺利拿到api返回的数据,并绑定到html标签中,
但是想到很多个controller可能会用到此api,不利于维护,所以想在一个统一的地方去调用api,就在factory中调用,结果问题出来了,由于$http是异步加载的,还没等返回数据,controller就绑定一个空对象到前端,导致显示不出调用API返回的数据。网上也查了很多资料,一直没解决这个问题。不知道是版本的问题还是其他原因,用网上给的方式,会报错。

我把代码贴出来,各位大侠看看,怎么解决这个问题,拜托了,好郁闷的。。。。。。。
endpoint.js
angular.module("endpoint", []).service("endpointConfig", function () {
var self = this;
var siteUrl = "/";
self.getUser = {
url: siteUrl + "static/common/json/user.json",
method: "GET"
};
});


userModule.js
var userModule = angular.module("userModule", ["endpoint"]);
userModule.factory("userModel", function ($http, endpointConfig) {
var userModel = {};
userModel.query = function () {
$http({
url: endpointConfig.getUser.url,
method: endpointConfig.getUser.method,
data: {
}
}).success(function (data, header, config, status) {
//响应成功
debugger;
return data;
}).error(function (data, header, config, status) {
//处理响应失败
return data
});
//return {firstName:"static-johnny",lastName:"Yin",email:"adfsd@qq.com"};
};
return userModel;
});


userController.js
userModule.controller("userController", function ($scope, userModel) {
debugger;
$scope.model = userModel.query();
});


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<link href="static/common/plugins/bootstrap/bootstrap.min.css" rel="stylesheet" />
</head>
<body ng-app="userModule" ng-controller="userController">
<div class="jumbotron">
<input class="form-control" value="" ng-model="model.firstName" />
<h1>First Name:<span ng-bind="model.firstName"></span></h1>
<h1>Last Name:<span ng-bind="model.lastName"></span></h1>
<h1>Email:<span ng-bind="model.email"></span></h1>
</div>
<script src="static/common/plugins/angular/angular.min.js"></script>
<script src="static/common/js/app/services/endpoint.js"></script>
<script src="static/common/js/app/modules/userModule.js"></script>
<script src="static/common/js/app/controllers/userController.js"></script>
</body>
</html>
...全文
11404 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
软件攻城尸 2017-02-15
  • 打赏
  • 举报
回复
angular.module("modelName",[]) .service("modelName", function($http, $q){ this.modelFunction = function(pm){ // defer()创建延迟对象 // notify()传递中间过程 // resolve()成功 // reject()失败 // when()传递已有数据不产生延迟 var defer = $q.defer(); $http({ method: 'GET', url: Url, params: pm }).success(function(data, status, headers, cfg) { defer.resolve(data); }).error(function(data, status, headers, cfg) { defer.reject(data); }); return defer.promise; }; }); ----------------------------------------------------------------- 调用: modelName.modelFunction ($scope.searchparam).then(function(res){ $scope.danju = res; });
uniume 2016-09-13
  • 打赏
  • 举报
回复
你好,你这个解决方法方便向我讲解一下么,我试了没成功~
limjiregister 2016-04-20
  • 打赏
  • 举报
回复
楼主的错误在于,在factory里根本没有返回异步获取的数据出去: var userModule = angular.module("userModule", ["endpoint"]); userModule.factory("userModel", function ($http, endpointConfig) { var userModel = {}; return { userModel.query = function () { return $http({ url: endpointConfig.getUser.url, method: endpointConfig.getUser.method, data: { } }).success(function (data, header, config, status) { //响应成功 debugger; return data; }).error(function (data, header, config, status) { //处理响应失败 return data }); //return {firstName:"static-johnny",lastName:"Yin",email:"adfsd@qq.com"}; }; } }); ======================= 我大概按照我的想法修改了一下,没验证,因为不是我的代码。大概意思就是层层返回return
limjiregister 2016-04-20
  • 打赏
  • 举报
回复
引用 7 楼 baidu_34471116 的回复:
在controller里面获取factory里面异步请求的值时,在controller里面加上.then(function(res){})就可以获取到,res.data就是服务器返回的值

.controller('Ctrl', function($scope,Api) {
    Api.getDetail().then(function(res){
        $scope.data=res.data
    });
})
表示行不通:angular1.5.3.min.js:116TypeError: Cannot read property 'success' of undefined 换成你说的then也是如此
baidu_34471116 2016-03-29
  • 打赏
  • 举报
回复
在controller里面获取factory里面异步请求的值时,在controller里面加上.then(function(res){})就可以获取到,res.data就是服务器返回的值

.controller('Ctrl', function($scope,Api) {
    Api.getDetail().then(function(res){
        $scope.data=res.data
    });
})
wefxwec4a 2016-01-26
  • 打赏
  • 举报
回复
引用 5 楼 calcend 的回复:
请问怎么传参数的?@wefxwec4a 4楼
你想从哪儿往哪儿传???
calcend 2015-12-21
  • 打赏
  • 举报
回复
请问怎么传参数的?@wefxwec4a 4楼
wefxwec4a 2015-09-09
  • 打赏
  • 举报
回复
我已经解决了,用service中的接口统一promise来解决这个问题: 首先是server

myapp.service('userInfo',['$http','$q',function($http,$q){
  var userInfo={};

  return {
    getUserInfo:function(){
      // 如果已存在则直接返回
      if(userInfo.name){
        return $q.when(userInfo);
      }
      //如果不存在数据则加载
      return $http.get('url').then(function(res){
        // 把数据存到server中并返回
        .userInfo=res.data;
        return res.data;
      })
    }
  }
}]);
然后在ctrl中接收

myapp.controller('xxxCtrl',['userInfo', '$scope',function(userInfo, $scope){
  userInfo.getUserInfo().then(function(res){
    $scope.userInfo=res;
  });
}]);
wefxwec4a 2015-09-09
  • 打赏
  • 举报
回复
我也想问,这个问题题主解决了么?
Just_cl 2015-08-21
  • 打赏
  • 举报
回复
你好,请问这个问题解决了吗
殷小强 2015-08-12
  • 打赏
  • 举报
回复
如果把$http调用API的方法去掉,改成硬编码形式,就能正常显示数据。

var userModule = angular.module("userModule", ["endpoint"]);
userModule.factory("userModel", function ($http, endpointConfig) {
var userModel = {};
userModel.query = function () {
//$http({
// url: endpointConfig.getUser.url,
// method: endpointConfig.getUser.method,
// data: {
// }
//}).success(function (data, header, config, status) {
// //响应成功
// debugger;
// return data;
//}).error(function (data, header, config, status) {
// //处理响应失败
// return data
//});
return {firstName:"static-johnny",lastName:"Yin",email:"adfsd@qq.com"};
};
return userModel;
});


<最新AngularJS开发宝典视频教程> ├最新AngularJS开发宝典—第001讲 什么是Angular及与Jquery实例对比分析.mp4 ├最新AngularJS开发宝典—第002讲 模块、控制器、视图模型、双向数据绑定模型、双向数据绑定.mp4 ├最新AngularJS开发宝典—第003讲 MVVM双向数据绑定图例分析(1).mp4 ├最新AngularJS开发宝典—第004讲 声明模块与控制器规范与依赖注入分析.mp4 ├最新AngularJS开发宝典—第005讲 $scope的基本使用方法.mp4 ├最新AngularJS开发宝典—第006讲 表达式与ng-bind及ng-cloak解决闪屏问题.mp4 ├最新AngularJS开发宝典—第007讲 ng-model在表单中双向绑定实例分析讲解.mp4 ├最新AngularJS开发宝典—第008讲 ng-value的使用实例讲解.mp4 ├最新AngularJS开发宝典—第009讲 实例讲解angular控制单选框.mp4 ├最新AngularJS开发宝典—第010讲 实例讲解angular操作checkbox复选框.mp4 ├最新AngularJS开发宝典—第011讲 实例讲解angular操作select列表框.mp4 ├最新AngularJS开发宝典—第012讲 函数使用方法大小写转换与对象深拷贝.mp4 ├最新AngularJS开发宝典—第013讲 函数使用对象扩充与数据遍历.mp4 ├最新AngularJS开发宝典—第014讲 json数据转换与本地存储及$scope数据序列化提交到后台.mp4 ├最新AngularJS开发宝典—第015讲 数据类型判断函数与数据比较方法的使用.mp4 ├最新AngularJS开发宝典—第016讲 ng-init与ng-trim及表单中表单value与$scope数据提交差异分析.mp4 ├最新AngularJS开发宝典—第017讲 使用ng-if、ng-show、ng-disabled、ng-init超简单实现网站注册协议设置.mp4 ├最新AngularJS开发宝典—第018讲 ng-repeat实例详细讲解与后盾人网站进行分析.mp4 ├最新AngularJS开发宝典—第019讲 g-selected、ng-disabled、ng-readonly实例讲解.mp4 ├最新AngularJS开发宝典—第020讲 超简单实现表单的全选与反选.mp4 ├最新AngularJS开发宝典—第021讲 ng-model-options设置数据同步时机提交网站性能.mp4 ├最新AngularJS开发宝典—第022讲 通过ng-class动态改变样式类实例操作.mp4 ├最新AngularJS开发宝典—第023讲 使用ng-style动态改变样式.mp4 ├最新AngularJS开发宝典—第024讲 事件处理指令讲解.mp4 ├最新AngularJS开发宝典—第025讲 AngularJS+flex弹性盒模型+bootStrap 开发微信菜单前端之手机界面预览.mp4 ├最新AngularJS开发宝典—第026讲 AngularJS+flex弹性盒模型+bootStrap 开发微信菜单前端之右侧编辑区域.mp4 ├最新AngularJS开发宝典—第027讲 AngularJS 弹性盒模型+bootStrap 开发微信菜单前端之根据微信SDK文档部署数据.mp4 ├最新AngularJS开发宝典—第028讲 弹性盒模型+bootStrap 开发微信菜单前端之根据菜单类型控制表单显示.mp4 ├最新AngularJS开发宝典—第029讲 弹性盒模型+bootStrap 开发微信菜单前端之添加菜单处理.mp4 ├最新AngularJS开发宝典—第030讲 弹性盒模型+bootStrap 开发微信菜单前端之使用fontawesome设置ui界面.mp4 ├最新AngularJS开发宝典—第031讲 弹性盒模型+bootStrap 开发微信菜单前端之underscore与lodash前端库介绍.mp4 ├最新AngularJS开发宝典—第032讲 弹性盒模型+bootStrap 开发微信菜单前端之使用underscore完成微信菜单删除操作.mp4 ├最新AngularJS开发宝典—第033讲 修复删除菜单时一级菜单选项不显示的问题.mp4 ├最新AngularJS开发宝典—第034讲 filter变量调节器分析与货币变量调节器处理.mp4 ├最新AngularJS开发宝典—第035讲 lowercase与uppercase过滤器使用.mp4 ├最新AngularJS开发宝典—第036讲 使用limitTo过滤器截取字符.mp4 ├最新AngularJS开发宝典—第037讲 使用date过滤器处理时间.mp4 ├最新AngularJS开发宝典—第038讲 orderBy数据排序与filter筛选过滤器.mp4 ├最新AngularJS开发宝典—第039讲 控制器中如何使用顾虑器服务.mp4 ├最新AngularJS开发宝典—第040讲 callee与过滤器结合制作表格升降排序实例.mp4 ├最新AngularJS开发宝典—第041讲 使用$scope处理升降序.mp4 ├最新AngularJS开发宝典—第042讲 $scope.$watch监听数据变化.mp4 ├最新AngularJS开发宝典—第043讲 使用$watch与$filter过滤器制作数据筛选实例.mp4 ├最新AngularJS开发宝典—第044讲 自定义过滤器之手机加星过滤器实例.mp4 ├最新AngularJS开发宝典—第045讲 SPA应用与自定义指令使用场景应用场景分析.mp4 ├最新AngularJS开发宝典—第046讲 自定义指令directive的restrict属性说明.mp4 ├最新AngularJS开发宝典—第047讲 自定义指令名称的标准规范.mp4 ├最新AngularJS开发宝典—第048讲 自定义指令template函数式操作实例讲解.mp4 ├最新AngularJS开发宝典—第049讲 自定义指令replace属性详解.mp4 ├最新AngularJS开发宝典—第050讲 自定义指令transclude与templateUrl属性详解.mp4 ├最新AngularJS开发宝典—第051讲 controller控制器scope父子集作用域实例讲解一 .mp4 ├最新AngularJS开发宝典—第052讲 controller控制器scope父子集作用域实例讲解二.mp4 ├最新AngularJS开发宝典—第053讲 指令scope作用域分析一.mp4 ├最新AngularJS开发宝典—第054讲 scope隔离作用域之@单向文本绑定.mp4 ├最新AngularJS开发宝典—第055讲 scope隔离作用域之=双向文本绑定.mp4 ├最新AngularJS开发宝典—第056讲 scope隔离作用域之=&调用父作用域中函数.mp4 ├最新AngularJS开发宝典—第057讲 指令directive的controller属性.mp4 ├最新AngularJS开发宝典—第058讲 指令directive的link属性详解.mp4 ├最新AngularJS开发宝典—第059讲 tab面板组件的指令实现.mp4 ├最新AngularJS开发宝典—第060讲 服务server应用分析与使用场景.mp4 ├最新AngularJS开发宝典—第061讲 使用$scope.$apply进行数据脏检查.mp4 ├最新AngularJS开发宝典—第062讲 $timeout与$interval实际使用场景分析与实例讲解.mp4 ├最新AngularJS开发宝典—第063讲 $window服务的实例讲解.mp4 ├最新AngularJS开发宝典—第064讲 $sce服务安全的处理html数据.mp4 ├最新AngularJS开发宝典—第065讲 $cacheFactory的缓存实例讲解.mp4 ├最新AngularJS开发宝典—第066讲 $http服务获取后台数据.mp4 ├最新AngularJS开发宝典—第067讲 $http服务请求缓存操作减少服务器压力加快页面展示.mp4 ├最新AngularJS开发宝典—第068讲 $http服务简写操作.mp4 ├最新AngularJS开发宝典—第069讲 $http服务之后台接收POST数据的几种方式.mp4 ├最新AngularJS开发宝典—第070讲 spa项目的server层分析与使用factory创建服务.mp4 ├最新AngularJS开发宝典—第071讲 多个控制器共享服务server数据的处理实例.mp4 ├最新AngularJS开发宝典—第072讲 使用service创建自定义服务.mp4 ├最新AngularJS开发宝典—第073讲 SPA应用的路由使用分析.mp4 ├最新AngularJS开发宝典—第074讲 uiRouter默认路由规则操作.mp4 ├最新AngularJS开发宝典—第075讲 uiRouter链接上实例路由跳转方式.mp4 ├最新AngularJS开发宝典—第076讲 uiRouter路由模板设置方式实例.mp4 ├最新AngularJS开发宝典—第077讲 uiRouter路由控制器使用方式详解.mp4 ├最新AngularJS开发宝典—第078讲 uiRouter路由控制器或指令中执行路由跳转.mp4 ├最新AngularJS开发宝典—第079讲 uiRouter路由参数设置与$stateParams服务的使用.mp4 ├最新AngularJS开发宝典—第080讲 uiRouter路由定义高效的父子级嵌套路由.mp4 ├最新AngularJS开发宝典—第081讲 uiRouter路由定义超灵活的嵌套路由视频.mp4 └最新AngularJS开发宝典—第082讲 uiRouter路由多个view下的父子级视频图嵌套使用.mp4

10,612

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 其他
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧