DIV树选择器
- 首先引用iview,因为要用到iview的tree和select
- TreeSellect其实就是将iview的tree和select进行结合,将tree选中的值传递给select
- tree的
on-check-change
事件中将选中的树节点的key和title作为一个新数组付给select的options绑定的数组,将key付给select绑定的值。这样就完成了从tree到select的数据绑定 - 当tree和select都开启多选的情况下,select对选中的值进行编辑并不会影响树的选择,所以要实现从select到tree的数据绑定
- tree的
getCheckedNodes
方法可以获得选中的节点的数组,将该数组中的节点删除将直接影响tree的选中情况 - 将tree选中的node放入checkedNodes,将key组成keyList放入全局中
- 将entitySelelct选中改变时,将选中的值的list与keyList对比,找出改变的key,将checkedNodes中与key匹配的node的check改为false
html
<Select id="entitySelect" ref='entitySelect' v-model="selectedEntity" multiple
placeholder="请选择"
@on-change="entitySelectChange"
@on-open-change="onOpenChangeOfEntitySelect"
style="width: 220px; min-width:220px; margin-top: 5px;">
<Option v-for="item of entityList" :value="item.value" :key="item.value"
style="display: none;">{{ item.label }}
</Option>
<Tree :data="entityTreeData" expand-node=true show-checkbox ref='entityTree'
@on-check-change="entityTreeSelected"></Tree>
</Select>
data
entityTreeData: [],
entityList: [],
selectedEntity: [],
checkedNodesKeyList: [],
checkedNodes: [],
methods
entityTreeSelected (data) {
let selected = []
let selectKeyList = []
data.forEach((element) => {
let key = element.key
let title = element.title
let code = element.code
let selectedItem = {
value: key,
label: title,
code: code
}
selectKeyList.push(key)
selected.push(selectedItem)
})
this.entityList = []
this.selectedEntity = []
this.entityList = selected
this.selectedEntity = selectKeyList
this.checkedNodes = this.$refs.entityTree.getCheckedNodes()
this.checkedNodesKeyList = []
this.checkedNodes.forEach(element => {
this.checkedNodesKeyList.push(element.key)
})
this.page.currentPageNum = 1
this.refreshTable()
},
entitySelectChange (data) {
document.getElementById('entitySelect').style.width = 'auto'
this.condition.entity = []
let diff = this.checkedNodesKeyList.filter(val => {
return this.selectedEntity.indexOf(val) === -1
})
diff.forEach(element => {
let nodeKey = this.checkedNodes.find(item => item.key === element).nodeKey
let checked = false
this.$refs.entityTree.handleCheck({ checked, nodeKey })
})
data.forEach(element => {
let rightItem = this.entityList.find(item => item.value === element)
if (!rightItem) {
this.condition.entity = []
return
}
let entityItem = {}
entityItem.entityKey = rightItem.value
entityItem.entityCode = rightItem.code
entityItem.entityTitle = rightItem.label
this.condition.entity.push(entityItem)
})
},
onOpenChangeOfEntitySelect (flag) {
if (flag) {
} else {
}
},