170 lines
5.0 KiB
JavaScript

import Ember from 'ember';
import $ from 'jquery';
export default Ember.Service.extend({
/**
* Ajax.doGet('url.get',
* {id: 001, name: 'foo'},
* function(data) {
* // success
* }, function(msg) {
* // fail
* });
* no params
* Ajax.doGet('url.get',
* function(data) {
* // success
* }, function(msg){
* // fail
* });
* @param {Boolean} [loadmask], option
* @param {String} url
* @param {Object} [params]
* @param {Function} [fnSucc]
* @param {Function} [fnFail]
*/
doGet() {
this._process_request(arguments, 'GET');
},
/**
* @see #get
*/
doPost() {
this._process_request(arguments, 'POST');
},
/**
* @see #get
*/
doPut() {
this._process_request(arguments, 'PUT');
},
/**
* @see #get
*/
doDel() {
this._process_request(arguments, 'DELETE');
},
/**
* private
*/
_request(p) {
var me = this;
p.loadmask && me.set('loading', true);
var formDataCfg;
if (p.params instanceof FormData) {
formDataCfg = false;
}
$.ajax({
url: p.url,
data: p.params,
type: (/get/i).test(p.method) ? 'GET' : 'POST',
contentType: formDataCfg,
processData: formDataCfg,
success(r, status, resp) {
if (r.success) {
// ignore success callback
if (p.fnSucc !== false) {
let keys = Object.keys(r);
me._isFunc(p.fnSucc) ?
p.fnSucc(keys.length === 3 &&
keys.includes('data') ? r.data : r) :
me.message.alert(r.data || 'Ajax Request Successfully');
}
}
else if (r.errcode === 4011) {
// $.trigger('NOT_LOGIN', true);
Ember.getOwner(me).lookup('route:application').transitionTo('login');
}
// ignore fail callback
else if (p.fnFail !== false) {
me._isFunc(p.fnFail) ? p.fnFail(r.errmsg, r) :
me.dialog.error(r.errmsg || 'Ajax Request Error Caused');
}
else {
me.dialog.error(r.errmsg || 'Ajax Request Error Caused');
}
p.loadmask && me.set('loading', false);
},
error(jqXHR, textStatus) {
Ember.Logger.error('Ajax Request Error Caused', arguments);
if (textStatus === 'timeout') {
me.dialog.error('Ajax Request Timeout Error Caused.');
}
else if (textStatus === 'abort') {
me.dialog.error('Ajax Request Client Abort Error Caused.');
}
else {
me.dialog.error('Ajax Request Error Caused.');
}
p.loadmask && me.set('loading', false);
}
});
},
/**
* {
* [lm], [url], [params], [fnSucc], [fnFail]
* }
*/
_process_request(args, method) {
var me = this;
if (args && args.length) {
// args to array
args = Array.prototype.slice.call(args);
var lm = args.shift(), // loadmask
url,
p,
fnSucc,
fnFail;
// loadmask
if ($.type(lm) === 'boolean') {
url = args.shift();
}
else {
url = lm;
// default loadmask
lm = true;
}
me._parse_params_and_callbacks(args);
// params
p = args.shift();
// callbacks
fnSucc = args.shift();
fnFail = args.shift();
// Ajax Request
me._request({
loadmask: lm,
method: method || 'GET',
url: url,
params: p,
fnSucc: fnSucc,
fnFail: fnFail
});
}
else {
console.error('Ajax No Args Given.');
}
},
/**
* params, fnSucc, fnFail
* fnSucc, fnFail
* fnFail
*/
_parse_params_and_callbacks(args) {
// has callbacks
if (this._isFunc(args[1]) && this._isFunc(args[2])) {
this._isFunc(args[0]) && (args[0] = args[0]());
}
// no params, params is success callback
else if (this._isFunc(args[0])) {
args[2] = args[1];
args[1] = args[0];
args[0] = null;
}
},
_isFunc(f) {
return $.type(f) === 'function';
}
});