1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  | <template> 
 |    <zt-combo ref="combo" :placeholder="placeholder" :readonly="readonly" :disabled="disabled" @input-change="onInputChange"> 
 |      <zt-tree-selector ref="tree" v-model="treeValue" 
 |                        :isDisplay="isDisplay" 
 |                        :idField="idField" :textField="textField" :parentIdField="parentIdField" 
 |                        :disabled="disabled" 
 |                        :url="url" :datas="datas" :simple="simple" :multiple="multiple" :leaf-only="leafOnly" 
 |                        :check-strictly="checkStrictly" :lazy="lazy" :expandLevel="expandLevel" 
 |                        :disabled-filter="disabledFilter" @selected="onSelected"/> 
 |    </zt-combo> 
 |    
 |  </template> 
 |  <script> 
 |    import {debounce} from 'lodash' 
 |    export default { 
 |      name: 'ZtComboTree', 
 |      components: {}, 
 |      props: { 
 |        value: [String, Array], 
 |        idField: { 
 |          type: String, 
 |          default: 'id' 
 |        }, 
 |        isDisplay:{ 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        textField: { 
 |          type: String, 
 |          default: 'name' 
 |        }, 
 |        parentIdField: { 
 |          type: String, 
 |          default: 'pid' 
 |        }, 
 |        url: String, 
 |        datas: [String, Array], 
 |        simple: { // 简单模式 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        multiple: { 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        leafOnly: { // 是否只能选择叶子节点 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        checkStrictly: { 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        lazy: { // 懒加载子节点 
 |          type: Boolean, 
 |          default: true 
 |        }, 
 |        expandLevel: { // 懒加载展开层级 
 |          type: Number, 
 |          default: 0 
 |        }, 
 |        disabledFilter: Function, // 可选的节点 
 |        disabled: { 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        readonly:{ 
 |          type: Boolean, 
 |          default: false 
 |        }, 
 |        placeholder: String 
 |      }, 
 |      data() { 
 |        return { 
 |          treeValue: this.value 
 |        } 
 |      }, 
 |      watch: { 
 |        value(val, oldval) { // 传递给tree-selector 
 |          this.treeValue = val 
 |        } 
 |      }, 
 |      methods: { 
 |        onInputChange: debounce(function (val) { 
 |          this.$refs.tree.filter(val) 
 |          if ((val || '').length === 0) { // 清空了 
 |            this.$emit('input', '') 
 |            this.$emit('select', null, true) 
 |          } 
 |        }, 1000), 
 |        onSelected(data, isChange) { 
 |          if (!this.multiple) { // 单选 
 |            if (!data) { 
 |              this.$refs.combo.setText('') 
 |            } else { 
 |              this.$refs.combo.setText(data[this.textField]) // combox设置显示值 
 |            } 
 |            this.$refs.combo.close() 
 |          } else { // 多选 
 |            let texts = [] 
 |            let values = [] 
 |            data.forEach(node => { 
 |              texts.push(node[this.textField]) 
 |              values.push(node[this.idField]) 
 |            }) 
 |            this.$refs.combo.setText(texts.join(',')) 
 |          } 
 |          this.$emit('input', this.treeValue) // 这里也可以自己根据data返回自己的 
 |          this.$emit('select', data, isChange) 
 |        } 
 |      } 
 |    } 
 |  </script> 
 |  <style lang="scss"> 
 |    .is-reverse { 
 |      transform: rotate(-180deg); 
 |    } 
 |    
 |    .comb-tree { 
 |      height: 250px; 
 |      overflow-y: auto; 
 |    
 |      label.el-checkbox { 
 |        margin-right: 8px; 
 |      } 
 |    
 |    } 
 |  </style> 
 |  
  |