bootstrap-datetimepicker with vue.js not working properly
I couldn't find a better way than losing focus (blur).
Here's my code:
Vue.component('picker', {
'props': ['date'],
'template': '\
<div class="form-group">\
<div class="input-group date datepicker">\
<input type="text" class="form-control" :value="this.date" v-on:focus="datepick_dialog_open" v-on:blur="select_by_lose_focus">\
<span class="input-group-addon">\
<span class="glyphicon glyphicon-calendar"></span>\
</span>\
</div>\
</div>',
'mounted': function() {
$(this.$el.firstChild).datetimepicker();
},
'methods': {
'datepick_dialog_open': function() {
this.$el.firstChild.children[1].click();
},
'select_by_lose_focus': function() {
console.log('AHOY!');
this.date = this.$el.firstChild.firstChild.value;
}
}
});
app = new Vue({
'el': '#app',
'data': {}
});
The point is, you really can't use it if your element does not lose focus. It updates the data when input loses its focus. IDK any better way.
v-on:focus
is irrelevant. It just opens the datetime picker UI when input gains focus.
The main job is done by select_by_lose_focus
.
Another example using $emit and v-model on the component. This page describes why value and $emit are needed to support v-model. I needed a form element name and optional required class for validation.
https://vuejs.org/v2/guide/components.html#Form-Input-Components-using-Custom-Events
<picker name="start_date_1_1" required="1" v-model="res.start_date"></picker>
Vue.component('picker', {
props: ['name', 'value', 'required'],
template: '\
<div class="form-group">\
<div class="input-group date">\
<input :name="name" type="text" class="form-control" v-bind:class="{required: required}" v-bind:value="value">\
<span class="input-group-addon">\
<span class="glyphicon glyphicon-calendar"></span>\
</span>\
</div>\
</div>',
mounted: function() {
var self = this;
var picker = $(this.$el.firstChild).datepicker({autoclose: true});
picker.on('changeDate', function(e) {
self.$emit('input', e.date.toLocaleDateString("en-US", {day: '2-digit', month: '2-digit', year: 'numeric'}));
});
}
});