Blame view

src/components/auto-complete/auto-complete.vue 4.74 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"
fed3e09d   梁灏   add AutoComplete ...
11
12
13
14
15
16
17
18
          filterable
          remote
          auto-complete
          :remote-method="remoteMethod"
          @on-change="handleChange"
          :transfer="transfer">
          <slot name="input">
              <i-input
acb79ba3   梁灏   fixed #433
19
                  :element-id="elementId"
fed3e09d   梁灏   add AutoComplete ...
20
21
22
                  ref="input"
                  slot="input"
                  v-model="currentValue"
0460a1e8   梁灏   fixed #812
23
                  :name="name"
fed3e09d   梁灏   add AutoComplete ...
24
25
26
                  :placeholder="placeholder"
                  :disabled="disabled"
                  :size="size"
9cc6213c   梁灏   update AutoComplete
27
                  :icon="inputIcon"
fed3e09d   梁灏   add AutoComplete ...
28
29
30
31
32
33
34
35
36
37
38
39
40
41
                  @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
42
      import Emitter from '../../mixins/emitter';
fed3e09d   梁灏   add AutoComplete ...
43
44
45
  
      export default {
          name: 'AutoComplete',
7af00356   梁灏   update AutoComplete
46
          mixins: [ Emitter ],
fed3e09d   梁灏   add AutoComplete ...
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
          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']);
                  }
              },
9cc6213c   梁灏   update AutoComplete
77
78
79
              icon: {
                  type: String
              },
fed3e09d   梁灏   add AutoComplete ...
80
81
82
83
              filterMethod: {
                  type: [Function, Boolean],
                  default: false
              },
96c0c8ae   梁灏   fixed #2803
84
85
86
87
88
89
              placement: {
                  validator (value) {
                      return oneOf(value, ['top', 'bottom']);
                  },
                  default: 'bottom'
              },
fed3e09d   梁灏   add AutoComplete ...
90
91
92
              transfer: {
                  type: Boolean,
                  default: false
0460a1e8   梁灏   fixed #812
93
94
95
              },
              name: {
                  type: String
acb79ba3   梁灏   fixed #433
96
97
98
              },
              elementId: {
                  type: String
fed3e09d   梁灏   add AutoComplete ...
99
100
101
102
              }
          },
          data () {
              return {
b904fd87   梁灏   update AutoComplete
103
104
                  currentValue: this.value,
                  disableEmitChange: false    // for Form reset
fed3e09d   梁灏   add AutoComplete ...
105
106
107
              };
          },
          computed: {
9cc6213c   梁灏   update AutoComplete
108
109
110
111
112
113
114
115
              inputIcon () {
                  let icon = '';
                  if (this.clearable && this.currentValue) {
                      icon = 'ios-close';
                  } else if (this.icon) {
                      icon = this.icon;
                  }
                  return icon;
fed3e09d   梁灏   add AutoComplete ...
116
117
118
119
120
121
122
123
124
125
126
              },
              filteredData () {
                  if (this.filterMethod) {
                      return this.data.filter(item => this.filterMethod(this.currentValue, item));
                  } else {
                      return this.data;
                  }
              }
          },
          watch: {
              value (val) {
b904fd87   梁灏   update AutoComplete
127
                  this.disableEmitChange = true;
fed3e09d   梁灏   add AutoComplete ...
128
129
130
131
132
                  this.currentValue = val;
              },
              currentValue (val) {
                  this.$refs.select.query = val;
                  this.$emit('input', val);
b904fd87   梁灏   update AutoComplete
133
134
135
136
                  if (this.disableEmitChange) {
                      this.disableEmitChange = false;
                      return;
                  }
fed3e09d   梁灏   add AutoComplete ...
137
                  this.$emit('on-change', val);
7af00356   梁灏   update AutoComplete
138
                  this.dispatch('FormItem', 'on-form-change', val);
fed3e09d   梁灏   add AutoComplete ...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
              }
          },
          methods: {
              remoteMethod (query) {
                  this.$emit('on-search', query);
              },
              handleChange (val) {
                  this.currentValue = val;
                  this.$refs.select.model = val;
                  this.$refs.input.blur();
                  this.$emit('on-select', val);
              },
              handleFocus () {
                  this.$refs.select.visible = true;
              },
              handleBlur () {
                  this.$refs.select.visible = false;
              },
              handleClear () {
b9541c05   梁灏   update AutoComplete
158
                  if (!this.clearable) return;
fed3e09d   梁灏   add AutoComplete ...
159
160
161
162
163
164
                  this.currentValue = '';
                  this.$refs.select.model = '';
              }
          }
      };
  </script>