ionic hybrid APP(ionic)ionic开发

Ionic使用interceptor统一处理HTTP请求

2016-10-31  本文已影响871人  格吾刚哥

实际上我们会经常使用HTTP请求时候做一个加载提示,但是每次都去写ionicLoading确实很麻烦,我们可以在使用interceptor拦截器做统一的处理。

比如官网介绍的方法:

http://learn.ionicframework.online/formulas/loading-screen-with-interceptors/


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

通过代码,可以看出来是借助于$rootScope的$broadcast和$on来传播和接收事件,从而控制提示框的显示和隐藏。

事实上,我们也可以通过$injector本身来获取到具体的服务,比如下面的代码:

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 || {};
  
    return config;
}

是不是简单多了,实际使用项目的时候,我偏向于后一种方法,而尽量减少使用$rootScope避免全局变量污染。

上一篇下一篇

猜你喜欢

热点阅读