【发布时间】:2017-04-29 22:36:34
【问题描述】:
我为select 创建了一个自定义组件,它以 15 分钟的间隔显示一天的所有时间。我还可以传递一个可选的最小开始时间值。在我的 html 中,我使用了其中两个组件。
我已将组件定义为
Vue.component('time-select', {
template: `
<select :value="value"
ref= 'input'
v-on:input="onChange($event.target.value)">
<option value=""> {{firstOption}} </option>
<option v-for="t in getHours()" :value="t">
{{ t }}
</option>
</select>
`,
props: {
value: String,
startTime: String,
firstOption: {
type: String,
default: "Select"
},
step: {
type: Number,
default: 15
}
},
methods: {
getHours: function() {
var startHr = 0;
var startMin = 0;
if (this.startTime) {
var timeParts = this.startTime.split(/[\s:]+/);
startHr = parseInt(timeParts[0]);
startMin = parseInt(timeParts[1]);
var ampm = timeParts[2];
if(ampm == "PM" && startHr < 12)
startHr = startHr + 12;
else if(ampm == "AM" && startHr === 12)
startHr = startHr - 12;
}
var hours = [];
var start = new Date(1,1,1,startHr,startMin);
var end = new Date(1,1,2,0,0);
if(this.startTime)
{
start.setMinutes(start.getMinutes() + this.step);
}
for (var d = start; d < end; d.setMinutes(d.getMinutes() + this.step))
{
hours.push(this.format(d));
}
return hours;
},
format: function(date)
{
var hours = date.getHours();
var minutes = date.getMinutes();
var ampm = hours < 12? "AM" : (hours=hours%12,"PM");
hours = hours == 0? 12 : hours < 10? ("0" + hours) : hours;
minutes = minutes < 10 ? ("0" + minutes) : minutes;
var ret = hours + ":" + minutes + " " + ampm;
return ret;
},
onChange: function(val) {
this.$emit('input', val);
},
}
});
JsFiddle 链接是https://jsfiddle.net/xsnswxu1/1/
现在,如果您从第一个下拉列表中选择任何值(例如上午 01:30),从第二个下拉列表中选择任何值(例如上午 03:30),然后再次将第一个下拉列表的值更改为 12:30 am,第二个下拉列表的值会自动更改(对于本示例,它是凌晨 02:30)。虚拟机数据保持不变。当我更改第一个下拉列表时,不应更改第二个下拉列表值。知道我做错了什么。 VM 没有更新,这很好,但是如果我更改第一个下拉列表,第二个下拉列表显示值会发生变化。
【问题讨论】:
-
如果第一次开始时间发生变化,那么结束时间如何有效,因为第二次的值是基于开始时间的?如果有的话,更改开始时间应该清除结束时间。
-
只要结束时间有效,就应该保持不变。虚拟机数据保持不变。不知道为什么vue会更新html值。我错过了什么还是 Vue 的问题。
标签: vuejs2 vue-component