在我们日常的项目开发中,每当页面需要和服务端存在交互的时候,为了界面的友好,我们都会在界面中给个loading的加载图标,当从服务端获取到数据或者已经把本地数据送到服务端并且得到相应的回应的时候我们就会隐藏刚刚的加载图标。

但是之前我们通常的做法都是在每一页面对应的controller中注入$ionicLoading,当发送请求的时候调用$ionicLoading.show();当完成与服务端的交互的时候就将loading隐藏掉,调用$ionicLoading.hide()方法,但是这样真的很麻烦,代码的重复度太高了,几乎每个页面都会不停的重复的写着这两行代码,所以这里我找到了一个一劳永逸的方法免去大家以后每个页面的loading的编写

因为最近项目比较忙,时间不多,这里 就不做过多介绍,直接上方法:

方法一:利用广播(因为拦截器中不能够注入$ionicLoading)

代码如下:

var app = angular.module('ionicApp', ['ionic'])

app.config(function($httpProvider) {
$httpProvider.interceptors.push(function($rootScope) {
return {
request: function(config) {
$rootScope.$broadcast('loading:show')
return config
},
response: function(response) {
$rootScope.$broadcast('loading:hide')
return response
}
}
})
}) app.run(function($rootScope, $ionicLoading) {
$rootScope.$on('loading:show', function() {
$ionicLoading.show({template: 'foo'})
}) $rootScope.$on('loading:hide', function() {
$ionicLoading.hide()
})
}) app.controller('MainCtrl', function($http, $ionicLoading) {
var _this = this $http.jsonp('http://api.openbeerdatabase.com/v1/breweries.json?callback=JSON_CALLBACK').then(function(result) {
_this.breweries = result.data.breweries
})
})

代码比较简单,这里就不做过多介绍了。

方法二:利用拦截器中$injector,正式我现在项目中用的方法。

拦截器中虽然不能够注入别的东西,但是有个$injector有个get方法,可以获取到别的服务,代码非常简单:

request: function (config) {
if (config.url.toString().indexOf('http://') === 0) {
$injector.get('$ionicLoading').show({
template: '<div><svg class="circular"><circle r="20" class="path" cx="50" cy="50" fill="none" stroke-width="2" stroke-miterlimit="10"></circle></svg>'
});
}
config.headers = config.headers || {};
var token = localStorageService.get('token'); if (token && token.expires_at && token.expires_at > new Date().getTime()) {
config.headers.Authorization = 'Bearer ' + token.access_token;
} return config;
}

在response中隐藏掉loading,注意这里无论是正确的返回还是错误的返回都必须隐藏。

因为错误的返回后面各种操作代码比较多,这里就粘贴下正确的返回的代码:

    if(response.config.url.indexOf(' === 0 ){
$injector.get('$ionicLoading').hide();
}
return response;
}

最新文章

  1. Android新建数据库和建表demo
  2. (转)非常完善的Log4net详细说明
  3. 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?以及Github的注册过程
  4. salesforce 零基础学习(十九)Permission sets 讲解及设置
  5. Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat)
  6. 在 C++ 代码中使用 UE4 插件---Using a plugin in C++ code
  7. mssql server提示无权限
  8. python3 多线程的基本用法
  9. string 对象及其操作
  10. w10 系统升级
  11. (转)SQL中的ISNULL函数介绍
  12. java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade
  13. 计算机网络 NAT
  14. 整理一批 国内外优秀设计团队 &amp; 设计相关网站
  15. 洛谷4月月赛R1
  16. 在Spring Boot框架下使用WebSocket实现消息推送
  17. 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据
  18. spring整合thymeleaf
  19. drools规则引擎中易混淆语法分析_相互触发导致死循环分析
  20. powerdesigner反转数据库的设计图

热门文章

  1. SQL server学习(五)T-SQL编程之存储过程
  2. 启动Azure模拟器出错解决方案
  3. C# 遍历控件 示例
  4. CRC类(处理ITU表)
  5. 安卓工作室 android studio文件和代码模板,以及汉化出错问题
  6. 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
  7. BZOJ.4817.[SDOI2017]树点涂色(LCT DFS序 线段树)
  8. java中的文件下载
  9. redis 在 php 中的应用(Server[ 服务器] 篇)
  10. unity 判断物体是否在视角内(巧妙!)