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>
...全文
11379 11 打赏 收藏 转发到动态 举报
写回复
用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
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充值模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充值模块:用户可以通过添加银行卡再为自己进行充值操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

10,606

社区成员

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

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