(function () {
/**
* 表单提交
*
* @param opts
* @constructor
*/
var $eColumns = {};
LA.Form = function (opts) {
opts = $.extend({
$form: null,
errorClass: 'has-error',
groupSelector: '.form-group',
template: '
',
disableRedirect: false, //
columnSelectors: {}, //
disableRemoveError: false,
before: function () {},
after: function () {},
}, opts);
var originalVals = {},
cls = opts.errorClass,
groupSlt = opts.groupSelector,
tpl = opts.template,
$form = opts.$form,
tabSelector = '.tab-pane',
get_tab_id = function ($c) {
return $c.parents(tabSelector).attr('id');
},
get_tab_title_error = function ($c) {
var id = get_tab_id($c);
if (!id) return $('');
return $("[href='#" + id + "'] .text-red");
};
var self = this;
// 移除错误信息
remove_field_error();
$form.ajaxSubmit({
beforeSubmit: function (d, f, o) {
if (opts.before(d, f, o, self) === false) {
return false;
}
if (fire(LA._form_.before, d, f, o, self) === false) {
return false;
}
LA.NP.start();
},
success: function (d) {
LA.NP.done();
if (opts.after(true, d, self) === false) {
return;
}
if (fire(LA._form_.success, d, self) === false) {
return;
}
if (!d.status) {
LA.error(d.message || 'Save failed!');
return;
}
LA.success(d.message || 'Save succeeded!');
if (opts.disableRedirect || d.redirect === false) return;
if (d.redirect) {
return LA.reload(d.redirect);
}
history.back(-1);
},
error: function (v) {
LA.NP.done();
if (opts.after(false, v, self) === false) {
return;
}
if (fire(LA._form_.error, v, self) === false) {
return;
}
try {
var error = JSON.parse(v.responseText), i;
if (v.status != 422 || !error || !LA.isset(error, 'errors')) {
return LA.error(v.status + ' ' + v.statusText);
}
error = error.errors;
for (i in error) {
// 显示错误信息
$eColumns[i] = show_field_error($form, i, error[i]);
}
} catch (e) {
return LA.error(v.status + ' ' + v.statusText);
}
}
});
// 触发钩子事件
function fire(evs) {
var i, j, r, args = arguments, p = [];
delete args[0];
args = args || [];
for (j in args) {
p.push(args[j]);
}
for (i in evs) {
r = evs[i].apply(evs[i], p);
if (r === false) return r; // 返回 false 会代码阻止继续执行
}
}
// 删除错误有字段的错误信息
function remove_field_error() {
var i, p, t;
for (i in $eColumns) {
p = $eColumns[i].parents(groupSlt);
p.removeClass(cls);
p.find('error').html('');
t = get_tab_title_error($eColumns[i]);
if (!t.hasClass('hide')) {
t.addClass('hide');
}
}
// 重置
$eColumns = {};
}
// 显示错误信息
function show_field_error($form, column, errors) {
var $c = get_field_obj($form, column);
get_tab_title_error($c).removeClass('hide');
// 保存字段原始数据
originalVals[column] = get_val($c);
if (!$c) {
if (LA.len(errors) && errors.length) {
LA.error(errors.join(" \n "));
}
return;
}
var p = $c.closest(groupSlt), j;
p.addClass(cls);
for (j in errors) {
p.find('error').eq(0).append(tpl.replace('_message_', errors[j]));
}
if (!opts.disableRemoveError) {
remove_error_when_val_changed($c, column);
}
return $c;
}
// 获取字段对象
function get_field_obj($form, column) {
if (column.indexOf('.') != -1) {
column = column.split('.');
var first = column.shift(), i, sub = '';
for (i in column) {
sub += '[' + column[i] + ']';
}
column = first + sub;
}
var $c = $form.find('[name="' + column + '"]');
if (!$c.length) $c = $form.find('[name="' + column + '[]"]');
if (!$c.length) {
$c = $form.find('[name="' + column.replace(/start$/, '') + '"]');
}
if (!$c.length) {
$c = $form.find('[name="' + column.replace(/end$/, '') + '"]');
}
if (!$c.length) {
$c = $form.find('[name="' + column.replace(/start\]$/, ']') + '"]');
}
if (!$c.length) {
$c = $form.find('[name="' + column.replace(/end\]$/, ']') + '"]');
}
return $c;
}
// 获取字段值
function get_val($c) {
var vals = [],
t = $c.attr('type'),
cked = t === 'checkbox' || t === 'radio',
i;
for (i = 0; i < $c.length; i++) {
if (cked) {
vals.push($($c[i]).prop('checked'));
continue;
}
vals.push($($c[i]).val());
}
return vals;
}
// 当字段值变化时移除错误信息
function remove_error_when_val_changed($c, column) {
var p = $c.parents(groupSlt);
$c.one('change', rm);
$c.off('blur', rm).on('blur', function () {
if (val_changed()) rm();
});
// 表单值发生变化就移除错误信息
function autorm() {
setTimeout(function () {
if (!$c.length) return;
if (val_changed()) return rm();
autorm();
}, 500);
}
autorm();
// 判断值是否改变
function val_changed() {
return !LA.arr.equal(originalVals[column], get_val($c));
}
function rm() {
p.removeClass(cls);
p.find('error').html('');
// tab页下没有错误信息了,隐藏title的错误图标
var id = get_tab_id($c), t;
if (id && !$('#'+id).find('.'+cls).length) {
t = get_tab_title_error($c);
if (!t.hasClass('hide')) {
t.addClass('hide');
}
}
delete $eColumns[column];
}
}
};
})();