landers.angular
Version:
landers.angular
139 lines (133 loc) • 5.95 kB
JavaScript
;angular.module('Landers.angular')
.provider('Ajax', function() {
var provider = this;
this.hosturl = '';
this.$get = ['$http', '$rootScope', '$q', function($http, $rootScope, $q){
var csrf_token;
function Ajax() {
var _debug, _loading, _headers;
var _hosturl = provider.hosturl;
var cancellers = [];
var prevents = {
error : false,
error_once : false
};
var build_url = function(url, params) {
if (params) {
url = Landers.url.qs.set(url, params);
}
var url_info = Landers.url.parse(url);
return url_info.protocol ? url : _hosturl + url;
};
this.setHosturl = function(hosturl){
_hosturl = hosturl;
return this;
}
this.debug = function(is){
_debug = is !== false && is !== 0;
return this;
};
this.loading = function(is){
_loading = is === true || is === undefined;
return this;
};
this._get = function(method, url, params){
var that = this;
url = build_url(url, params);
var ret, config = {ignoreLoadingBar: !_loading};
var canceler = $q.defer();
cancellers.push(canceler);
// 添加timeout设置为promise对象,才可以取消未完成的request请求
config.timeout = canceler.promise;
switch (method.toLowerCase()) {
case 'get' :
ret = $http.get(url, config); break;
// case 'delete':
// ret = $http.delete(url, config); break;
}
ret.success(that.success).error(that.error)
.finally(function(){cancellers.pop();});
_loading = _debug = false;
return ret;
};
this.get = function(url, params) {
return this._get('get', url, params);
};
this.delete = function(url, data){
return this._post('delete', url, data);
};
this._post = function(method, url, xvar, params){
var that = this;
url = build_url(url, params);
// var data = angular.isString(xvar) || angular.isElement(xvar) ? Form.data(xvar) : xvar;
var ret, data = xvar || {};
var config = {ignoreLoadingBar: !_loading, headers: {}}; //, withCredentials:true
var csrf_token = $('meta[name=csrf-token]').attr('content');
if (csrf_token) config.headers['X-CSRF-TOKEN'] = csrf_token;
if (_headers) {
angular.extend(config.headers, _headers);
_headers = null;
}
var canceler = $q.defer();
cancellers.push(canceler);
// 添加timeout设置为promise对象,才可以取消未完成的request请求
config.timeout = canceler.promise;
switch (method.toLowerCase()) {
case 'post' :
ret = $http.post(url, data, config); break;
case 'put' :
data['_method'] = 'put';
ret = $http.put(url, data, config); break;
case 'delete':
config.data = data;
config.headers['Content-type'] = 'application/json;charset=utf-8';
ret = $http.delete(url, config); break;
}
ret.success(that.success).error(that.error)
.finally(function(){cancellers.pop();});
_loading = _debug = false;
return ret;
};
this.withHeaders = function(headers){
_headers = headers;
return this;
};
this.post = function(url, xvar, params){
return this._post('post', url, xvar, params);
};
this.put = function(url, data, params){
return this._post('put', url, data, params);
};
this.success = function(rspn, code, header){
if (rspn.code == 1 && rspn.message) {
Landers.msgbox(rspn);
}
};
this.error = function(rspn) {
if (!angular.isObject(rspn)) {
// console.log('无响应404');
rspn = {
success : false,
message : '' //'远程无响应或OPTION方法',
};
}
};
this.cancelAll = function(i){
if ( cancellers.length ) {
var canceller;
while (canceller = cancellers.pop()) {
canceller.resolve("user cancelled");
}
}
};
}
return {
make:function(){
return new Ajax();
},
csrf_token:function(){
return csrf_token;
}
};
}];
});