mirror of https://github.com/ElemeFE/element
				
				
				
			DatePicker: fix change event no trigger when setting the initial value, fixed #2167
							parent
							
								
									4da8b2a2dd
								
							
						
					
					
						commit
						1bdecf9c39
					
				|  | @ -10,8 +10,8 @@ | |||
|     @focus="handleFocus" | ||||
|     @blur="handleBlur" | ||||
|     @keydown.native="handleKeydown" | ||||
|     :value="visualValue" | ||||
|     @change.native="visualValue = $event.target.value" | ||||
|     :value="displayValue" | ||||
|     @change.native="displayValue = $event.target.value" | ||||
|     ref="reference"> | ||||
|     <i slot="icon" | ||||
|       class="el-input__icon" | ||||
|  | @ -27,7 +27,7 @@ | |||
| <script> | ||||
| import Vue from 'vue'; | ||||
| import Clickoutside from 'element-ui/src/utils/clickoutside'; | ||||
| import { formatDate, parseDate, getWeekNumber, equalDate } from './util'; | ||||
| import { formatDate, parseDate, getWeekNumber, equalDate, isDate } from './util'; | ||||
| import Popper from 'element-ui/src/utils/vue-popper'; | ||||
| import Emitter from 'element-ui/src/mixins/emitter'; | ||||
| import ElInput from 'element-ui/packages/input'; | ||||
|  | @ -213,7 +213,7 @@ export default { | |||
|     return { | ||||
|       pickerVisible: false, | ||||
|       showClose: false, | ||||
|       internalValue: '' | ||||
|       currentValue: '' | ||||
|     }; | ||||
|   }, | ||||
| 
 | ||||
|  | @ -222,16 +222,22 @@ export default { | |||
|       if (this.readonly || this.disabled) return; | ||||
|       val ? this.showPicker() : this.hidePicker(); | ||||
|     }, | ||||
|     internalValue(val) { | ||||
|       if (!val && this.picker && typeof this.picker.handleClear === 'function') { | ||||
|     currentValue(val) { | ||||
|       if (val) return; | ||||
|       if (this.picker && typeof this.picker.handleClear === 'function') { | ||||
|         this.picker.handleClear(); | ||||
|       } else { | ||||
|         this.$emit('input'); | ||||
|       } | ||||
|     }, | ||||
|     value: { | ||||
|       immediate: true, | ||||
|       handler(val) { | ||||
|         this.internalValue = val; | ||||
|         this.currentValue = isDate(val) ? new Date(val) : val; | ||||
|       } | ||||
|     }, | ||||
|     displayValue(val) { | ||||
|       this.$emit('change', val); | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|  | @ -246,7 +252,7 @@ export default { | |||
|     }, | ||||
| 
 | ||||
|     valueIsEmpty() { | ||||
|       const val = this.internalValue; | ||||
|       const val = this.currentValue; | ||||
|       if (Array.isArray(val)) { | ||||
|         for (let i = 0, len = val.length; i < len; i++) { | ||||
|           if (val[i]) { | ||||
|  | @ -284,9 +290,9 @@ export default { | |||
|       return HAVE_TRIGGER_TYPES.indexOf(this.type) !== -1; | ||||
|     }, | ||||
| 
 | ||||
|     visualValue: { | ||||
|     displayValue: { | ||||
|       get() { | ||||
|         const value = this.internalValue; | ||||
|         const value = this.currentValue; | ||||
|         if (!value) return; | ||||
|         const formatter = ( | ||||
|           TYPE_VALUE_RESOLVER_MAP[this.type] || | ||||
|  | @ -318,9 +324,6 @@ export default { | |||
|   }, | ||||
| 
 | ||||
|   created() { | ||||
|     this.cachePicker = {}; | ||||
|     this.cacheChange = {}; | ||||
| 
 | ||||
|     // vue-popper | ||||
|     this.options = { | ||||
|       boundariesPadding: 0, | ||||
|  | @ -340,26 +343,25 @@ export default { | |||
|     handleClickIcon() { | ||||
|       if (this.readonly || this.disabled) return; | ||||
|       if (this.showClose) { | ||||
|         this.internalValue = ''; | ||||
|         this.currentValue = ''; | ||||
|         this.showClose = false; | ||||
|       } else { | ||||
|         this.pickerVisible = !this.pickerVisible; | ||||
|       } | ||||
|     }, | ||||
| 
 | ||||
|     dateIsUpdated(date, cache) { | ||||
|       let updated = true; | ||||
| 
 | ||||
|       if (Array.isArray(date)) { | ||||
|         if (equalDate(cache.cacheDateMin, date[0]) && | ||||
|           equalDate(cache.cacheDateMax, date[1])) updated = false; | ||||
|         cache.cacheDateMin = new Date(date[0]); | ||||
|         cache.cacheDateMax = new Date(date[1]); | ||||
|     dateChanged(dateA, dateB) { | ||||
|       if (Array.isArray(dateA)) { | ||||
|         let len = dateA.length; | ||||
|         if (!dateB) return true; | ||||
|         while (len--) { | ||||
|           if (!equalDate(dateA[len], dateB[len])) return true; | ||||
|         } | ||||
|       } else { | ||||
|         if (equalDate(cache.cacheDate, date)) updated = false; | ||||
|         cache.cacheDate = new Date(date); | ||||
|         if (!equalDate(dateA, dateB)) return true; | ||||
|       } | ||||
| 
 | ||||
|       return updated; | ||||
|       return false; | ||||
|     }, | ||||
| 
 | ||||
|     handleClose() { | ||||
|  | @ -400,7 +402,7 @@ export default { | |||
|     showPicker() { | ||||
|       if (this.$isServer) return; | ||||
|       if (!this.picker) { | ||||
|         this.panel.defaultValue = this.internalValue; | ||||
|         this.panel.defaultValue = this.currentValue; | ||||
|         this.picker = new Vue(this.panel).$mount(document.createElement('div')); | ||||
|         this.picker.popperClass = this.popperClass; | ||||
|         this.popperElm = this.picker.$el; | ||||
|  | @ -423,12 +425,6 @@ export default { | |||
|             this.picker.selectableRange = ranges.map(range => parser(range, format)); | ||||
|           } | ||||
| 
 | ||||
|           if (this.type === 'time-select' && options) { | ||||
|             this.$watch('pickerOptions.minTime', val => { | ||||
|               this.picker.minTime = val; | ||||
|             }); | ||||
|           } | ||||
| 
 | ||||
|           for (const option in options) { | ||||
|             if (options.hasOwnProperty(option) && | ||||
|                 // 忽略 time-picker 的该配置项 | ||||
|  | @ -446,9 +442,7 @@ export default { | |||
| 
 | ||||
|         this.picker.$on('dodestroy', this.doDestroy); | ||||
|         this.picker.$on('pick', (date, visible = false) => { | ||||
|           if (this.dateIsUpdated(date, this.cachePicker)) this.$emit('input', date); | ||||
| 
 | ||||
|           this.$nextTick(() => this.dateIsUpdated(date, this.cacheChange) && this.$emit('change', this.visualValue)); | ||||
|           if (this.dateChanged(date, this.value)) this.$emit('input', date); | ||||
|           this.pickerVisible = this.picker.visible = visible; | ||||
|           this.picker.resetView && this.picker.resetView(); | ||||
|         }); | ||||
|  | @ -463,10 +457,10 @@ export default { | |||
| 
 | ||||
|       this.updatePopper(); | ||||
| 
 | ||||
|       if (this.internalValue instanceof Date) { | ||||
|         this.picker.date = new Date(this.internalValue.getTime()); | ||||
|       if (this.currentValue instanceof Date) { | ||||
|         this.picker.date = new Date(this.currentValue.getTime()); | ||||
|       } else { | ||||
|         this.picker.value = this.internalValue; | ||||
|         this.picker.value = this.currentValue; | ||||
|       } | ||||
|       this.picker.resetView && this.picker.resetView(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,6 +11,12 @@ export default { | |||
|     isRange: Boolean | ||||
|   }, | ||||
| 
 | ||||
|   data() { | ||||
|     return { | ||||
|       type: '' | ||||
|     }; | ||||
|   }, | ||||
| 
 | ||||
|   created() { | ||||
|     this.type = this.isRange ? 'timerange' : 'time'; | ||||
|     this.panel = this.isRange ? TimeRangePanel : TimePanel; | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ export default { | |||
| 
 | ||||
|   name: 'ElTimeSelect', | ||||
| 
 | ||||
|   created() { | ||||
|   beforeCreate() { | ||||
|     this.type = 'time-select'; | ||||
|     this.panel = Panel; | ||||
|   } | ||||
|  |  | |||
|  | @ -13,9 +13,13 @@ export const equalDate = function(dateA, dateB) { | |||
| }; | ||||
| 
 | ||||
| export const toDate = function(date) { | ||||
|   return isDate(date) ? date : null; | ||||
| }; | ||||
| 
 | ||||
| export const isDate = function(date) { | ||||
|   date = new Date(date); | ||||
|   if (isNaN(date.getTime())) return null; | ||||
|   return date; | ||||
|   if (isNaN(date.getTime())) return false; | ||||
|   return true; | ||||
| }; | ||||
| 
 | ||||
| export const formatDate = function(date, format) { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 qingwei.li
						qingwei.li