J'essaie d'activer la fonction foo()
avec le @click
mais, comme vous pouvez le constater, vous devez appuyer sur le bouton radio deux fois pour déclencher l'événement correctement. Ne capturez la valeur que la deuxième fois que vous appuyez sur ...
Je souhaite déclencher l'événement sans @click
uniquement si l'événement v-model
(srStatus) est modifié.
voici mon violon:
Cela est dû au fait que votre gestionnaire click
se déclenche avant que la valeur du bouton radio ne change. Vous devez plutôt écouter l'événement change
:
<input
type="radio"
name="optionsRadios"
id="optionsRadios2"
value=""
v-model="srStatus"
v-on:change="foo"> //here
Assurez-vous également que vous voulez vraiment appeler foo()
sur prêt ... semble que vous ne voulez peut-être pas faire cela.
ready:function(){
foo();
},
Vous pouvez réellement simplifier cela en supprimant les directives v-on
:
<input type="radio" name="optionsRadios" id="optionsRadios1" value="1" v-model="srStatus">
Et utilisez la méthode watch
pour écouter le changement:
new Vue ({
el: "#app",
data: {
cases: [
{ name: 'case A', status: '1' },
{ name: 'case B', status: '0' },
{ name: 'case C', status: '1' }
],
activeCases: [],
srStatus: ''
},
watch: {
srStatus: function(val, oldVal) {
for (var i = 0; i < this.cases.length; i++) {
if (this.cases[i].status == val) {
this.activeCases.Push(this.cases[i]);
alert("Fired! " + val);
}
}
}
}
});
Vue2: si vous souhaitez uniquement détecter le changement de flou d’entrée (par exemple, après avoir appuyé sur Entrée ou sur un autre emplacement), faites (plus d'infos ici )
<input @change="foo" v-model... >
Si vous souhaitez détecter les modifications d'un seul caractère (lors de la saisie par l'utilisateur), utilisez
<input @keydown="foo" v-model... >
Vous pouvez également utiliser les événements @keyup
et @input
. Si vous souhaitez transmettre des paramètres supplémentaires, utilisez-les dans le modèle, par exemple. @keyDown="foo($event, param1, param2)"
. Comparaison ci-dessous (version modifiable ici )
new Vue({
el: "#app",
data: {
keyDown: { key:null, val: null, model: null, modelCopy: null },
keyUp: { key:null, val: null, model: null, modelCopy: null },
change: { val: null, model: null, modelCopy: null },
input: { val: null, model: null, modelCopy: null },
},
methods: {
keyDownFun: function(event){ // type of event: KeyboardEvent
console.log(event);
this.keyDown.key = event.key; // or event.keyCode
this.keyDown.val = event.target.value; // html current input value
this.keyDown.modelCopy = this.keyDown.model; // copy of model value at the moment on event handling
},
keyUpFun: function(event){ // type of event: KeyboardEvent
console.log(event);
this.keyUp.key = event.key; // or event.keyCode
this.keyUp.val = event.target.value; // html current input value
this.keyUp.modelCopy = this.keyUp.model; // copy of model value at the moment on event handling
},
changeFun: function(event) { // type of event: Event
console.log(event);
this.change.val = event.target.value; // html current input value
this.change.modelCopy = this.change.model; // copy of model value at the moment on event handling
},
inputFun: function(event) { // type of event: Event
console.log(event);
this.input.val = event.target.value; // html current input value
this.input.modelCopy = this.input.model; // copy of model value at the moment on event handling
}
}
})
div {
margin-top: 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
Type in fields below (to see events details open browser console)
<div id="app">
<div><input type="text" @keyDown="keyDownFun" v-model="keyDown.model"><br> @keyDown (note: model is different than value and modelCopy)<br> key:{{keyDown.key}}<br> value: {{ keyDown.val }}<br> modelCopy: {{keyDown.modelCopy}}<br> model: {{keyDown.model}}</div>
<div><input type="text" @keyUp="keyUpFun" v-model="keyUp.model"><br> @keyUp (note: model change value before event occure) <br> key:{{keyUp.key}}<br> value: {{ keyUp.val }}<br> modelCopy: {{keyUp.modelCopy}}<br> model: {{keyUp.model}}</div>
<div><input type="text" @change="changeFun" v-model="change.model"><br> @change (occures on enter key or focus change (tab, outside mouse click) etc.)<br> value: {{ change.val }}<br> modelCopy: {{change.modelCopy}}<br> model: {{change.model}}</div>
<div><input type="text" @input="inputFun" v-model="input.model"><br> @input<br> value: {{ input.val }}<br> modelCopy: {{input.modelCopy}}<br> model: {{input.model}}</div>
</div>
Pour ajouter à la réponse correcte ci-dessus, dans Vue.JS v1.0, vous pouvez écrire
<a v-on:click="doSomething">
Donc, dans cet exemple, il serait
v-on:change="foo"
Vous devriez utiliser @input
:
<input @input="handleInput" />
@input
se déclenche lorsque l'utilisateur modifie la valeur d'entrée.
@change
se déclenche lorsque l'utilisateur modifie la valeur et déverrouille l'entrée (par exemple, cliqué quelque part à l'extérieur)
Vous pouvez voir la différence ici: https://jsfiddle.net/posva/oqe9e8pb/