Come attivare un evento quando cambia il modello v?


90

Sto cercando di attivare la foo()funzione con@click ma, come puoi vedere, è necessario premere il pulsante di opzione due volte per attivare correttamente l'evento. Cattura il valore solo la seconda volta che premi ...

Voglio attivare l'evento senza attivare l'evento @clicksolo quando v-model(srStatus) cambia.

ecco il mio violino:

http://fiddle.jshell.net/wanxe/vsa46bw8/


1
il collegamento del violino non funziona più.
FrenkyB

Se l'intento della chiamata foo()è quello di apportare modifiche non al modello, utilizzare unwatcher
Saksham

Questo è un ottimo esempio del motivo per cui è richiesto codice nella domanda . Se possibile, recuperalo e mostralo qui.
Isherwood

Vorrei poter recuperare il codice per la domanda, ma era già 5 anni fa ... per fortuna abbiamo buone risposte
jnieto

Risposte:


77

Ciò accade perché il clickgestore viene attivato prima che il valore del pulsante di opzione cambi. Devi invece ascoltare l' changeevento:

<input 
  type="radio" 
  name="optionsRadios" 
  id="optionsRadios2" 
  value=""
  v-model="srStatus" 
  v-on:change="foo"> //here

Inoltre, assicurati di voler davvero chiamare foo()pronto ... sembra che forse non lo desideri davvero.

ready:function(){
    foo();
},

Come gestireste gli Slider?
Royi

dove sono gli eventi disponibili elencati nella documentazione. Non riesco a trovarlo?
toraman

Questi sono solo eventi JavaScript standard che puoi trovare qui: developer.mozilla.org/en-US/docs/Web/Events#Standard_events
pherris

Grazie! Ma pronto: la funzione non ha funzionato per me. Invece, metodi: {foo () {// do something}}
Vince Banzon

Notare inoltre che se si desidera registrare eventi "v-on: change" su un componente vue personalizzato (componente file singolo), è necessario utilizzare "v-on: input".
Andrés Biarge

94

Puoi effettivamente semplificarlo rimuovendo le v-ondirettive:

<input type="radio" name="optionsRadios" id="optionsRadios1" value="1" v-model="srStatus">

E usa il watchmetodo per ascoltare il cambiamento:

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);
                }
            }
        }
    }
});

2
Puoi guardare automaticamente qualsiasi cambio di modello? Ad esempio per un modulo con più ingressi che devono essere tutti guardati?
Eric Burel

@EricBurel So che questo è vecchio, ma la risposta è no. Non è possibile guardare l'intero oggetto dati a cui sono associati tutti i campi, è necessario controllare ogni singola proprietà di quell'oggetto singolarmente, rendendo questo approccio problematico per i record di grandi dimensioni su moduli con molti campi.
JohnC

1
@EricBurel In realtà puoi guardare gli oggetti annidati con la proprietà 'deep' impostata su 'true' -> vuejs.org/v2/api/#watch
SanBen

28

Vue2: se si desidera rilevare solo il cambiamento sulla sfocatura dell'input (ad esempio dopo aver premuto Invio o fare clic da qualche altra parte), fare (maggiori informazioni qui )

<input @change="foo" v-model... >

Se vuoi rilevare i cambiamenti di un singolo carattere (durante la digitazione da parte dell'utente) usa

<input @keydown="foo" v-model... >

Puoi anche usare @keyuped @inputeventi. Se vuoi passare parametri aggiuntivi usa nel template es @keyDown="foo($event, param1, param2)". Confronto di seguito (versione modificabile qui )


keyDown non funziona quando si preme "backspace". Quindi è meglio usare @input
Peretz30

In questo violino vediamo che backspace funziona con @keyDown jsfiddle.net/rLzm0f1q (tuttavia non dico che @inputsia cattivo o buono)
Kamil Kiełczewski

22

Dovresti usare @input:

<input @input="handleInput" />

@input si attiva quando l'utente modifica il valore di input.

@change si attiva quando l'utente cambia il valore e non mette a fuoco l'input (ad esempio, fa clic da qualche parte all'esterno)

Puoi vedere la differenza qui: https://jsfiddle.net/posva/oqe9e8pb/


Cosa puoi usare al posto del segno @? C'è qualche regola scritta da qualche parte su questo? Lo chiedo perché nel mio backend, il segno @ è riservato a qualcos'altro.
FrenkyB

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.