前几天接触一个二次开发,后台UI用的是layui框架,程序原来的TAG标签设置中自由输入的,想修改为单选。这样子的功能用于,一个产品属于两种分类的作法。第一种就是系统自带的产品分类,第二种使用标签来实现。然尔一个产品并不需要同时属于两个以上的标签,所以二次开发修改为单选radio,而不是多选checkbox。
不过本文作出的动态设置选中状态单选与多选的作法是一致的。
在前端模板文件中,普通用到的是使用<if condition=””></if>来作判断。但是奇怪的就是layui并不能识别。
第一次尝试:
<input class='layui-input' type='radio' name='tag' title='正常' value='正常' <if condition="">checked</if>>
发现在input包括中无法解析到if判断语句;当然在普通情况下是可以的,中不过程序使用了layui,因为layui通过js识别所有表单元素,重新编译了。所以在js的重新编译中无法识别原本不属于表无素材的标签。
第二次尝试:
<if condition="">
<input class='layui-input' type='radio' name='tag' title='正常' value='正常' checked>
<else/>
<input class='layui-input' type='radio' name='tag' title='正常' value='正常'>
</if>
以上代码确定可以选中状态,但随之又有其它问题随之而来,选中的与未选中的两个均会显示出来,为什么呢?
原因还是在于layui遍历form里的表单元素,并不会因if语句的存在而作出最终结果。而是识别到有两个input。
第三次尝试,不用radio,不就是单选吗?下拉单项也是可以的,使用<select>又测试了一番。同样会出现以上两个问题。
无办法下只能求助于神奇的百度给出了这样的结果;
$("input[name=tag][value=正常]").prop("checked","true");
form.render();
prop() 方法设置或返回被选元素的属性和值。
当该方法用于返回属性值时,则返回第一个匹配元素的值。
当该方法用于设置属性值时,则为匹配元素集合设置一个或多个属性/值对。
render()就是重新渲染对象;
看到这里很多朋友以为问题已经得到解决了,其实问题才刚刚开始。不是提示form对象找不到,就是提示form中找不到render()方法。为什么呢,整套程序不是doem,它还整合了很多其它的框架和插件,调作起来并不像官方给出的这么直接。
form.render();
$form.render();
form().render();
.layui.form().render();
……
通通试了一篇,还是不行,这东西就有这么折腾。累了中途休息一下。
一觉睡醒,阔然开朗。先来看看完成后的代码。
thistag="{$info.tag}";//读后台数据值
var mytag=new Array("无","第一项","第二项","第三项","第四项","第五项");//所有单选项目
cntag="";
for(j = 0,len=mytag.length; j < len; j++) { //遍历数组
if(thistag==mytag[j]){ //判断是否选中
cntag+="<input class=\'layui-input\' type=\'radio\' name=\'tag\' id=\'tag\' title=\'"+newtit+"\' value=\'"+mytag[j]+"\' checked>";
}else{
cntag+="<input class=\'layui-input\' type=\'radio\' name=\'tag\' id=\'tag\' title=\'"+newtit+"\' value=\'"+mytag[j]+"\' >";
}
}
$("#cntag").html(cntag); //打印到网页中显示最终效果
优点:只读一次后面数据;
简化:就算单选项很多,只需写在一个数组中即可。
简单:只需写一次判断语句;
原理既然是前端使用,多用js,少用<if><php>这些php后端定义的标签。