import Ember from 'ember'; 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; } Ember.$.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) { 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 (Ember.$.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 Ember.$.type(f) === 'function'; } });