Blame view

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