Skip to content

Instantly share code, notes, and snippets.

@LeoOnTheEarth
Last active May 11, 2018 11:02
Show Gist options
  • Save LeoOnTheEarth/2d57d17ee31855523222208d3ec39bf8 to your computer and use it in GitHub Desktop.
Save LeoOnTheEarth/2d57d17ee31855523222208d3ec39bf8 to your computer and use it in GitHub Desktop.
FormHandler for handle form template operation
var handler = new FormHandler($('form'));
// Reset value in form
handler.reset();
// Set value to form
handler.setValues({'post.id': 12, 'post.title': 'This is a demo title', 'post.author': 'Demo Author'});
;(function($) {
var DefaultValueProcessor = {
support: function($elem)
{
return true;
},
reset: function($elem)
{
$elem.val('');
},
setValue: function($elem, value)
{
$elem.val(value);
}
};
var SelectValueProcessor = {
support: function($elem)
{
return $elem[0].nodeName.toLowerCase() === 'select';
},
reset: function($elem)
{
$elem.find('option:selected').prop('selected', false);
},
setValue: function($elem, value)
{
if (Array.isArray(value)) {
for (var i = 0, len = value.length; i < len; ++i) {
$elem.each(function(elem) {
elem.selected = (elem.value === value[i].toString());
});
}
} else {
$elem.each(function(elem) {
elem.selected = (elem.value === value.toString());
});
}
}
};
var CheckBoxValueProcessor = {
support: function($elem)
{
return $elem[0].type.toLowerCase() === 'checkbox';
},
reset: function($elem)
{
$elem.prop('checked', false);
},
setValue: function($elem, value)
{
if (Array.isArray(value)) {
for (var i = 0, len = value.length; i < len; ++i) {
$elem.each(function(elem) {
elem.checked = (elem.value === value[i].toString());
});
}
} else {
$elem.each(function(elem) {
elem.checked = (elem.value === value.toString());
});
}
}
};
var RadioBoxValueProcessor = {
support: function($elem)
{
return $elem[0].type.toLowerCase() === 'radio';
},
reset: function($elem)
{
$elem.prop('checked', false);
},
setValue: function($elem, value)
{
$elem.each(function(elem) {
elem.checked = (elem.value === value.toString());
});
}
};
function ValueProcessorManager(extraValueProcessors)
{
extraValueProcessors = extraValueProcessors ? extraValueProcessors : [];
this.processors = [
SelectValueProcessor,
CheckBoxValueProcessor,
RadioBoxValueProcessor
];
for (var i = 0, len = extraValueProcessors.length; i < len; ++i) {
this.processors.push(extraValueProcessors[i]);
}
this.processors.push(DefaultValueProcessor);
}
ValueProcessorManager.prototype.reset = function($elem)
{
for (var i = 0, len = this.processors.length; i < len; ++i) {
if (this.processors[i].support($elem)) {
this.processors[i].reset($elem);
break;
}
}
};
ValueProcessorManager.prototype.setValue = function($elem, value)
{
for (var i = 0, len = this.processors.length; i < len; ++i) {
if (this.processors[i].support($elem)) {
this.processors[i].setValue($elem, value);
break;
}
}
};
function FormHandler($form, options)
{
this.$form = $form;
this.fields = getAllFields($form);
this.options = $.extend({valueProcessors: []}, isObject(options) ? options : {});
this.valueProcessorManager = new ValueProcessorManager(this.options.valueProcessors);
}
function isObject(value)
{
return typeof value === "object" && !Array.isArray(value);
}
function getAllFields($form)
{
var fields = {};
function addFields(prefix, values)
{
for (var key in values) {
if (values.hasOwnProperty(key)) {
var name = prefix + '[' + key + ']';
var value = values[key];
if (isObject(value)) {
addFields(name, value);
} else {
name = name + (Array.isArray(value) ? '[]' : '');
fields[name] = {
name: name,
value: value,
$elem: $form.find('[name="' + name + '"]')
};
}
}
}
}
addFields($form.attr('name'), values);
return fields;
}
FormHandler.prototype.reset = function()
{
for (var i = 0, len = this.fields.length; i < len; ++i) {
this.valueProcessorManager.reset(this.fields[i].$elem);
}
};
FormHandler.prototype.setValues = function(values)
{
var fields = [];
var valueProcessorManager = this.valueProcessorManager;
function setValues(prefix, values)
{
for (var key in values) {
if (values.hasOwnProperty(key)) {
var name = prefix + '[' + key + ']';
var value = values[key];
if (isObject(value)) {
setValues(name, value);
} else {
name = name + (Array.isArray(value) ? '[]' : '');
valueProcessorManager.setValue(fields[name], value);
}
}
}
}
setValues(this.$form.attr('name'), values);
};
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment