Blame view

src/components/auto-complete/auto-complete.vue 5.14 KB
fed3e09d   梁灏   add AutoComplete ...
1
2
3
4
5
6
7
8
9
  <template>
      <i-select
          ref="select"
          class="ivu-auto-complete"
          :label="label"
          :disabled="disabled"
          :clearable="clearable"
          :placeholder="placeholder"
          :size="size"
96c0c8ae   梁灏   fixed #2803
10
          :placement="placement"
f8620d9a   Sergio Crisostomo   Fix autocomplete ...
11
          :value="currentValue"
fed3e09d   梁灏   add AutoComplete ...
12
13
14
15
16
17
18
19
          filterable
          remote
          auto-complete
          :remote-method="remoteMethod"
          @on-change="handleChange"
          :transfer="transfer">
          <slot name="input">
              <i-input
acb79ba3   梁灏   fixed #433
20
                  :element-id="elementId"
fed3e09d   梁灏   add AutoComplete ...
21
22
23
                  ref="input"
                  slot="input"
                  v-model="currentValue"
0460a1e8   梁灏   fixed #812
24
                  :name="name"
fed3e09d   梁灏   add AutoComplete ...
25
26
27
                  :placeholder="placeholder"
                  :disabled="disabled"
                  :size="size"
9cc6213c   梁灏   update AutoComplete
28
                  :icon="inputIcon"
fed3e09d   梁灏   add AutoComplete ...
29
30
31
32
33
34
35
36
37
38
39
40
41
42
                  @on-click="handleClear"
                  @on-focus="handleFocus"
                  @on-blur="handleBlur"></i-input>
          </slot>
          <slot>
              <i-option v-for="item in filteredData" :value="item" :key="item">{{ item }}</i-option>
          </slot>
      </i-select>
  </template>
  <script>
      import iSelect from '../select/select.vue';
      import iOption from '../select/option.vue';
      import iInput from '../input/input.vue';
      import { oneOf } from '../../utils/assist';
7af00356   梁灏   update AutoComplete
43
      import Emitter from '../../mixins/emitter';
fed3e09d   梁灏   add AutoComplete ...
44
45
46
  
      export default {
          name: 'AutoComplete',
7af00356   梁灏   update AutoComplete
47
          mixins: [ Emitter ],
fed3e09d   梁灏   add AutoComplete ...
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
          components: { iSelect, iOption, iInput },
          props: {
              value: {
                  type: [String, Number],
                  default: ''
              },
              label: {
                  type: [String, Number],
                  default: ''
              },
              data: {
                  type: Array,
                  default: () => []
              },
              disabled: {
                  type: Boolean,
                  default: false
              },
              clearable: {
                  type: Boolean,
                  default: false
              },
              placeholder: {
                  type: String
              },
              size: {
                  validator (value) {
                      return oneOf(value, ['small', 'large', 'default']);
604ae4d3   梁灏   AutoComplete supp...
76
77
                  },
                  default () {
fe5ffd7f   梁灏   fixed #4196 #4165
78
                      return !this.$IVIEW || this.$IVIEW.size === '' ? 'default' : this.$IVIEW.size;
fed3e09d   梁灏   add AutoComplete ...
79
80
                  }
              },
9cc6213c   梁灏   update AutoComplete
81
82
83
              icon: {
                  type: String
              },
fed3e09d   梁灏   add AutoComplete ...
84
85
86
87
              filterMethod: {
                  type: [Function, Boolean],
                  default: false
              },
96c0c8ae   梁灏   fixed #2803
88
89
90
91
92
93
              placement: {
                  validator (value) {
                      return oneOf(value, ['top', 'bottom']);
                  },
                  default: 'bottom'
              },
fed3e09d   梁灏   add AutoComplete ...
94
95
              transfer: {
                  type: Boolean,
604ae4d3   梁灏   AutoComplete supp...
96
97
98
                  default () {
                      return this.$IVIEW.transfer === '' ? false : this.$IVIEW.transfer;
                  }
0460a1e8   梁灏   fixed #812
99
100
101
              },
              name: {
                  type: String
acb79ba3   梁灏   fixed #433
102
103
104
              },
              elementId: {
                  type: String
fed3e09d   梁灏   add AutoComplete ...
105
106
107
108
              }
          },
          data () {
              return {
b904fd87   梁灏   update AutoComplete
109
110
                  currentValue: this.value,
                  disableEmitChange: false    // for Form reset
fed3e09d   梁灏   add AutoComplete ...
111
112
113
              };
          },
          computed: {
9cc6213c   梁灏   update AutoComplete
114
115
116
117
118
119
120
121
              inputIcon () {
                  let icon = '';
                  if (this.clearable && this.currentValue) {
                      icon = 'ios-close';
                  } else if (this.icon) {
                      icon = this.icon;
                  }
                  return icon;
fed3e09d   梁灏   add AutoComplete ...
122
123
124
125
126
127
128
129
130
131
132
              },
              filteredData () {
                  if (this.filterMethod) {
                      return this.data.filter(item => this.filterMethod(this.currentValue, item));
                  } else {
                      return this.data;
                  }
              }
          },
          watch: {
              value (val) {
f32d1f41   Wu-K'ung   修复autoComplete的on...
133
134
135
                  if(this.currentValue !== val){
                      this.disableEmitChange = true;
                  }
fed3e09d   梁灏   add AutoComplete ...
136
137
138
                  this.currentValue = val;
              },
              currentValue (val) {
5de28f6f   zhouqing86   Fix AutoComplete ...
139
                  this.$refs.select.setQuery(val);
fed3e09d   梁灏   add AutoComplete ...
140
                  this.$emit('input', val);
b904fd87   梁灏   update AutoComplete
141
142
143
144
                  if (this.disableEmitChange) {
                      this.disableEmitChange = false;
                      return;
                  }
fed3e09d   梁灏   add AutoComplete ...
145
                  this.$emit('on-change', val);
7af00356   梁灏   update AutoComplete
146
                  this.dispatch('FormItem', 'on-form-change', val);
fed3e09d   梁灏   add AutoComplete ...
147
148
149
150
151
152
153
              }
          },
          methods: {
              remoteMethod (query) {
                  this.$emit('on-search', query);
              },
              handleChange (val) {
0dc5c972   Rookie_Zoe   fix#4558, AutoCom...
154
                  if (val === undefined || val === null) return;
fed3e09d   梁灏   add AutoComplete ...
155
                  this.currentValue = val;
fed3e09d   梁灏   add AutoComplete ...
156
157
158
                  this.$refs.input.blur();
                  this.$emit('on-select', val);
              },
11ab6519   blackcater   feat: exposure `o...
159
              handleFocus (event) {
11ab6519   blackcater   feat: exposure `o...
160
                  this.$emit('on-focus', event);
fed3e09d   梁灏   add AutoComplete ...
161
              },
11ab6519   blackcater   feat: exposure `o...
162
              handleBlur (event) {
11ab6519   blackcater   feat: exposure `o...
163
                  this.$emit('on-blur', event);
fed3e09d   梁灏   add AutoComplete ...
164
165
              },
              handleClear () {
b9541c05   梁灏   update AutoComplete
166
                  if (!this.clearable) return;
fed3e09d   梁灏   add AutoComplete ...
167
                  this.currentValue = '';
f8620d9a   Sergio Crisostomo   Fix autocomplete ...
168
                  this.$refs.select.reset();
bc0040d5   梁灏   AutoComplete add ...
169
                  this.$emit('on-clear');
fed3e09d   梁灏   add AutoComplete ...
170
171
172
              }
          }
      };
f32d1f41   Wu-K'ung   修复autoComplete的on...
173
  </script>