[英]How can I reduce code duplication in this JavaScript?
I am working on a task that's doing front end validations to our publisher. 我正在做的任务是对发布者进行前端验证。 In my code base we are using Handlebars to populate semantic themes and to add forms.
在我的代码库中,我们使用把手来填充语义主题并添加表单。 We have 6 types of assets which can be added in publisher and be managed by developers.
我们有6种资产类型,可以添加到发布者中并由开发者进行管理。
The input fields of a form are also populated through Handlebars at runtime and it is depending on a registry extension file that belongs to each assert type. 表单的输入字段也会在运行时通过Handlebars填充,并且取决于属于每个断言类型的注册表扩展文件。 I need to include required and readonly attributes to those input fields when it is populated.
填充时,我需要在这些输入字段中包含必填和只读属性。
I have tried out the below code: 我已经尝试了以下代码:
var renderField = function (field, options) {
var out = '';
var value = field.value || '';
if (field.required) {
switch (field.type) {
case 'options':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12">' + renderOptions(field.value, field.values[0].value, field) + '</div>';
break;
case 'text':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><input type="text" class="form-control" value="' + value + '"" ' + renderFieldMetaData(field, null, options) + ' class="span8" required></div>';
break;
case 'text-area':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><textarea row="3" ' + renderFieldMetaData(field, null, options) + ' class="width-full" required>' + value + '</textarea></div>';
break;
case 'file':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><input type="file" value="' + value + '" ' + renderFieldMetaData(field, null, options) + ' required></div>';
break;
default:
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12">Normal Field' + field.type + '</div>';
break;
}
return out;
}
if (field.readonly) {
switch (field.type) {
case 'options':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12">' + renderOptions(field.value, field.values[0].value, field) + '</div>';
break;
case 'text':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><input type="text" class="form-control" value="' + value + '"" ' + renderFieldMetaData(field, null, options) + ' class="span8" readonly></div>';
break;
case 'text-area':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><textarea row="3" ' + renderFieldMetaData(field, null, options) + ' class="width-full" readonly>' + value + '</textarea></div>';
break;
case 'file':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><input type="file" value="' + value + '" ' + renderFieldMetaData(field, null, options) + ' readonly></div>';
break;
default:
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12">Normal Field' + field.type + '</div>';
break;
}
return out;
}
if (!(field.required) || !(field.readonly)) {
switch (field.type) {
case 'options':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12">' + renderOptions(field.value, field.values[0].value, field) + '</div>';
break;
case 'text':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><input type="text" class="form-control" value="' + value + '"" ' + renderFieldMetaData(field, null, options) + ' class="span8"></div>';
break;
case 'text-area':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><textarea row="3" ' + renderFieldMetaData(field, null, options) + ' class="width-full">' + value + '</textarea></div>';
break;
case 'file':
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"><input type="file" value="' + value + '" ' + renderFieldMetaData(field, null, options) + '></div>';
break;
default:
out = '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12">Normal Field' + field.type + '</div>';
break;
}
return out;
}
};
And I would like to know if this code segment is causing too much code duplication. 我想知道此代码段是否引起过多的代码重复。 How can I simplify this task?
如何简化此任务?
Any suggestions are welcome. 欢迎任何建议。
Note that we can get the value of field.required
and field.readonly
as true or false? 请注意,我们可以将
field.required
和field.readonly
的值field.readonly
为true或false吗?
You can extract your switch to a function that creates the element 您可以将开关提取到创建元素的函数
var create = function(field){
switch (field.type) {
case 'options':
return renderOptions(field.value, field.values[0].value, field);
case 'text':
return '<input type="text" class="form-control" value="' + value + '"" ' + renderFieldMetaData(field, null, options) + ' class="span8" >';
case 'text-area':
return '<textarea row="3" ' + renderFieldMetaData(field, null, options) + ' class="width-full" >'+value+'</textarea>';
case 'file':
return '<input type="file" value="' + value + '" ' + renderFieldMetaData(field, null, options) + ' >';
default:
return 'Normal Field' + field.type;
}
}
and then you can alter your code to (assuming you are also using jquery) 然后您可以将代码更改为(假设您也在使用jquery)
var element = create(field);
if(field.type === "options" ||
field.type === "text" ||
field.type === "text-area" ||
field.type === "file"){
if(field.required){
element.attr('required',true);
}
if(field.readonly){
element.attr('readonly',true);
}
}
var outer = $('<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12"></div>');
outer.append(element);
This one looks a little simplified 这个看起来有点简化
var renderField = function (field, options) {
var out = '';
var value = field.value || '';
var cls = '';
if(field.required){
cls = 'required';
}else if(field.readonly){
cls = 'readonly';
}
switch (field.type) {
case 'options':
out = renderOptions(field.value, field.values[0].value, field);
break;
case 'text':
out = '<input type="text" class="form-control" value="' + value + '"" ' + renderFieldMetaData(field, null, options) + ' class="span8" '+cls+'>';
break;
case 'text-area':
out = '<textarea row="3" ' + renderFieldMetaData(field, null, options) + ' class="width-full" '+cls+'>' + value + '</textarea>';
break;
case 'file':
out = '<input type="file" value="' + value + '" ' + renderFieldMetaData(field, null, options) + ' '+cls+'>';
break;
default:
out = 'Normal Field' + field.type + '';
break;
}
return '<div class="custom-form-right col-lg-10 col-md-10 col-sm-12 col-xs-12">'+out+'</div>';
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.