easy-ui中combobox多选框的bug

前言

最近在维护老项目的过程中,遇到了个问题,前端使用的easy-ui的组件,需要使用一个输入库可以下拉,可以搜索的功能,所以使用了combobox这个组件,但是使用过程中发了个问题,就是我输入的字它居然当成了一个选项,导致出现各种问题

了解combobox

组合框(combobox)显示一个可编辑的文本框和下拉列表,用户可以从下拉列表中选择一个或多个值。用户可以直接输入文本到列表的顶部,或者从列表中选择一个或多个现成的值,具体使用方式参考

参考了官方的demo,发现官方demo也存在一样的问题,看来只能自己动手解决了,解决之前先来简单了解下combobox这个组件的常用方法和事件

setValues
1
$("#type").combobox('setValues', [1,2])

其中’setValues’是方法名,第二个是数组参数。还有单数形式的setValue,是设置单个值的,我们这里是多选,所以这个不赘述

getValues

获取当前选中的所有项,返回是个id的数组

1
$("#type").combobox("getValues")
getData

获取当前下拉框中的所有项

1
$("#type").combobox("getData")
onSelect()

选中事件,只有下拉框中选中某项时,才会触发

1
2
3
4
5
$("#iUserNameTree").combobox({
onSelect: function (n) {
...
}
});

n是当前选中的那一项,是个object的,其中有id,有value

需要注意的是,只是选中,反选不是用这个,反选用unselect,还有就是在事件里如果调用 getValues的话,是获取不到本次选中的那条的,因为select事件是选中的那瞬间调用的

onChange()

改变事件,下拉框选中后触发事件,特别注意,输入框中输入的文字也会触发该事件,使用方式如下

1
2
3
4
5
$("#iUserNameTree").combobox({
onChange: function (newValue, oldValue) {
...
}
});

其中newValue是选中或输入后最新的数组,oldValue是上次的数组,这里的数组里仅仅是ID的数组,且这个事件是在改变后调用的,所以如果在这个事件里调用gatData是可以获取到最新的选中的数组的

思路

我试下下setvalues方法,可以改变输入框里的选项,可以把输入的那个替换掉!所以我的思路时,比如我输入了一个王,搜索到我要的数据后,选中了其中一个,这时首先会调用select事件,其次调用change事件,我需要在选中后的change事件里做下处理,判断下oldValue数组中最后一个是我输入的还是选中的,如果是输入的,就把它删掉,重新setvalues一下,就可以了

结语

这样可能还是有点问题的,因为我判断是输入的还是选中的,仅仅是查询data中是否包含这个id,所以如果输入数字查询,正好又包含这个,那就无法去除了,但是一般情况够用了,不过现在这个时代了,这种项目其实早应该淘汰了,别太纠结,一句话,能用就行