diff --git a/src/components/date-picker/picker.vue b/src/components/date-picker/picker.vue
index df3d3987..734578ad 100644
--- a/src/components/date-picker/picker.vue
+++ b/src/components/date-picker/picker.vue
@@ -183,7 +183,9 @@
return this.internalValue.slice();
} else {
const isRange = this.type.includes('range');
- const val = this.internalValue.map(date => date instanceof Date ? new Date(date) : (date || ''));
+ let val = this.internalValue.map(date => date instanceof Date ? new Date(date) : (date || ''));
+
+ if (this.type.match(/^time/)) val = val.map(this.formatDate);
return (isRange || this.multiple) ? val : val[0];
}
},
@@ -293,8 +295,8 @@
);
},
emitChange () {
- this.$emit('on-change', this.visualValue, this.publicValue);
this.$nextTick(() => {
+ this.$emit('on-change', this.publicValue);
this.dispatch('FormItem', 'on-form-change', this.publicValue);
});
},
diff --git a/src/components/date-picker/util.js b/src/components/date-picker/util.js
index d85a2b56..90746525 100644
--- a/src/components/date-picker/util.js
+++ b/src/components/date-picker/util.js
@@ -163,6 +163,8 @@ const RANGE_FORMATTER = function(value, format) {
if (start && end) {
return formatDate(start, format) + RANGE_SEPARATOR + formatDate(end, format);
}
+ } else if (!Array.isArray(value) && value instanceof Date){
+ return formatDate(value, format);
}
return '';
};
diff --git a/test/unit/specs/date-picker.spec.js b/test/unit/specs/date-picker.spec.js
index 1961b68a..f1521384 100644
--- a/test/unit/specs/date-picker.spec.js
+++ b/test/unit/specs/date-picker.spec.js
@@ -1,4 +1,4 @@
-import { createVue, destroyVM, stringToDate, dateToString, promissedTick } from '../util';
+import { createVue, destroyVM, stringToDate, dateToString, dateToTimeString, promissedTick } from '../util';
describe('DatePicker.vue', () => {
let vm;
@@ -26,6 +26,79 @@ describe('DatePicker.vue', () => {
});
});
+ it('should pass correct arguments to on-change event', done => {
+ const now = new Date();
+ const nowDate = dateToString(now);
+ const nowTime = dateToTimeString(now);
+ const nextHour = dateToTimeString(now.getTime() + 36e5);
+ const nextWeek = new Date(now.getTime() + 6048e5);
+
+ let dateValue, dateRangeValue, timeValue, timeRangeValue;
+ vm = createVue({
+ template: `
+
+
+
+
+
+
+ `,
+ methods: {
+ onChangeDate(val) {
+ dateValue = val;
+ },
+ onChangeDateRange(val) {
+ dateRangeValue = val;
+ },
+ onChangeTime(val) {
+ timeValue = val;
+ },
+ onChangeTimeRange(val) {
+ timeRangeValue = val;
+ },
+ }
+ }, true);
+
+ vm.$nextTick(() => {
+ const [datePicker, dateRangePicker, timePicker, timeRangePicker] = vm.$children;
+
+ datePicker.handleInputChange({target: {value: nowDate}});
+ dateRangePicker.handleInputChange({target: {value: [
+ nowDate,
+ dateToString(nextWeek)
+ ].join(' - ')
+ }});
+
+ timePicker.handleInputChange({target: {value: nowTime}});
+ const timeRangeString = [
+ nowTime,
+ nextHour
+ ].join(' - ');
+ timeRangePicker.handleInputChange({target: {
+ value: timeRangeString
+ }});
+
+ vm.$nextTick(() => {
+ // DATE
+ expect(dateValue instanceof Date).to.equal(true);
+ expect(dateToString(dateValue)).to.equal(nowDate);
+ // DATERANGE
+ expect(Array.isArray(dateRangeValue)).to.equal(true);
+ expect(dateToString(dateRangeValue[0])).to.equal(nowDate);
+ expect(dateToString(dateRangeValue[1])).to.equal(dateToString(nextWeek));
+ // TIME
+ expect(typeof timeValue).to.equal('string');
+ expect(timeValue).to.equal(nowTime);
+ // TIMERANGE
+ expect(Array.isArray(timeRangeValue)).to.equal(true);
+ expect(timeRangeValue[0]).to.equal(nowTime);
+ expect(timeRangeValue[1]).to.equal(nextHour);
+
+ done();
+ });
+ });
+ });
+
it('should create a DatePicker component of type="datetimerange"', done => {
vm = createVue(`
@@ -134,7 +207,7 @@ describe('DatePicker.vue', () => {
it('should fire `on-change` when reseting value', done => {
const now = new Date();
- const nowDate = [now.getFullYear(), now.getMonth() + 1, now.getDate()].map(nr => (nr > 9 ? nr : '0' + nr)).join('-');
+ const nowDate = dateToString(now);
let onChangeCalled = false;
vm = createVue({
template: '',
diff --git a/test/unit/util.js b/test/unit/util.js
index cc48dc63..46920a19 100644
--- a/test/unit/util.js
+++ b/test/unit/util.js
@@ -14,6 +14,8 @@ const createElm = function() {
return elm;
};
+const pad = (nr) => nr < 10 ? '0' + nr : nr;
+
/**
* 回收 vm
* @param {Object} vm
@@ -72,9 +74,19 @@ exports.stringToDate = function(str) {
* @param {Date}
*/
exports.dateToString = function(d) {
- return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(nr => nr > 9 ? nr : '0' + nr).join('-');
+ return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(pad).join('-');
};
+/**
+ * Transform Date to HH:MM:SS string
+ * @param {Date}
+ */
+exports.dateToTimeString = function(d){
+ const date = new Date(d);
+ return [date.getHours(), date.getMinutes(), date.getSeconds()].map(pad).join(':');
+
+}
+
/**
* 触发一个事件
* mouseenter, mouseleave, mouseover, keyup, change, click 等