jQuery weui有个支持单选或者多选的select弹出层,默认他是这样的
第2部分选择什么值,第1部分就显示什么值,一般的场景支持是没问题了,但本次开发碰到了一个问题。
需求描述:
职业名称后面要显示一些描述,如“法官 2个案件在审理”,“医生 正在做手术”,同时要求点击对应项时,只显示“法官”,“医生”而不显示剩余的描述,根据select现有的逻辑是无法实现这个功能的。只能实现选项是什么,显示的值就是什么,不明白,看下图
解决方案:
查看官方文档,数据通过title和value进行控制,title是显示的值,value一般用于给后端传值
$("#mobile").select({
title: "选择职业",
items: [
{
title: "法官 2个案件在审理",
value: "001",
},
{
title: "医生 正在做手术",
value: "002",
}
]
});
很明显我们是可以通过修改items项的配置来实现该需求:
1、首先修改配置项
$("#mobile").select({
title: "选择职业",
items: [
{
title: "法官 2个案件在审理",
showTitle: "医生",
value: "001",
},
{
title: "医生 正在做手术",
showTitle: "医生",
value: "002",
}
]
});
showTitle用于回显
2、下面修改jquery.weui.js
大概从4695到4998行,Select组件封装在一个函数体中,这样避免变量污染同时也方便管理,大概有5个地方涉及到该需求,一个个来看:
2.1、Select.prototype.updateInputValue方法,该方法用于更新你点击的那个input的值及给他设置一个data-values值,这里有两个地方需要修改
原来的代码:
Select.prototype.updateInputValue = function(values, titles) {
var v, t;
if(this.config.multi) {
v = values.join(this.config.split);
t = titles.join(this.config.split);
} else {
v = values[0];
t = titles[0];
}
修改后的代码:
Select.prototype.updateInputValue = function(values, titles, showtitles) {
var v, t, s;
if(this.config.multi) {
v = values.join(this.config.split);
t = titles.join(this.config.split);
s = showtitles.join(this.config.split);
} else {
v = values[0];
t = titles[0];
s = showtitles[0];
}
新增了一个形参,同时对该形参进行了处理
原来的代码
this.$input.val(t).data("values", v);
this.$input.attr("value", t).attr("data-values", v);
修改后的代码
this.$input.val(s).data("values", v);
this.$input.attr("value", s).attr("data-values", v);
可以发现input的值不再是原来的值,改成了配置项showTitle的值
2.2、Select.prototype.parseInitValue方法,该方法用于反显,也就是你上次选值后再次调用select要把选中的部分给选上,整个方法更新如下:
Select.prototype.parseInitValue = function() {
var value = this.$input.val();
var items = this.config.items;
var dataVales = this.$input.attr('data-values')
//如果input为空,只有在第一次初始化的时候才保留默认选择。因为后来就是用户自己取消了全部选择,不能再为他选中默认值。
if( !this._init && (value === undefined || value =&