EDIT: A simpler solution for me was to just use @input.native
. Also, the this event has (now?) a isComposing
attribute which we can use to either take $event.data
into account, or $event.target.value
In my case, the only scheme that worked was handling @keydown
to save the value before the user action, and handling @keyup
to process the event if the value had changed. NOTE: the disadvantage of this is that any non-keyboard input (like copy/paste with a mouse) will not work.
<md-input
v-else
:value="myValue"
ref="input"
@keydown="keyDownValue = $event.target.value"
@keyup="handleKeyUp($event)"
@blur="handleBlur()"
/>
With handleKeyUp
in my case being:
handleKeyUp(evt){
if(evt.target.value !== this.keyDownValue){
this.$emit('edited', evt);
}
}
My use case was the following:
I requested a search endpoint in the backend to get suggestions as the user typed. Solutions like handling @compositionupdate
lead to sending several several requests to the backend (I also needed @input for non-mobile devices). I reduced the number of requests sent by correctly handling @compositionStarted
, but there was still cases where 2 requests were sent for just 1 character typed (when composition was left then, e.g. with space character, then re-entered, e.g. with backspace character).