Wie wird ein Ereignis ausgelöst, wenn sich das V-Modell ändert?

90

Ich versuche, die foo()Funktion mit dem zu starten, @clickaber wie Sie sehen können, müssen Sie das Optionsfeld zweimal drücken, um das Ereignis korrekt auszulösen. Erfassen Sie den Wert erst beim zweiten Drücken von ...

Ich möchte das Ereignis auslösen, ohne es @clicknur v-modelauszulösen, wenn sich (srStatus) ändert.

Hier ist meine Geige:

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

jnieto
quelle
1
Geigenlink funktioniert nicht mehr.
FrenkyB
Wenn die Absicht des Aufrufs darin foo()besteht, keine Vorlagenänderungen vorzunehmen, verwenden Sie awatcher
Saksham
Dies ist ein gutes Beispiel dafür, warum in der Frage Code erforderlich ist . Bitte stellen Sie es nach Möglichkeit wieder her und zeigen Sie es hier.
Isherwood
Ich wünschte, ich könnte den Code für die Frage abrufen, aber es war bereits vor 5 Jahren ... zum Glück haben wir gute Antworten
jnieto

Antworten:

75

Dies liegt daran, dass Ihr clickHandler ausgelöst wird, bevor sich der Wert des Optionsfelds ändert. Sie müssen changestattdessen das Ereignis anhören :

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

Stellen Sie außerdem sicher, dass Sie wirklich foo()bereit anrufen möchten. Vielleicht möchten Sie das auch nicht.

ready:function(){
    foo();
},
Pherris
quelle
Wie würden Sie mit Slidern umgehen?
Royi
Wo sind die verfügbaren Ereignisse in der Dokumentation aufgeführt? Ich kann es nicht finden
Toraman
Dies sind nur Standard-JavaScript-Ereignisse, die Sie hier finden können: developer.mozilla.org/en-US/docs/Web/Events#Standard_events
pherris
Vielen Dank! Aber fertig: Funktion hat bei mir nicht funktioniert. Stattdessen Methoden: {foo () {// etwas tun}}
Vince Banzon
Beachten Sie außerdem, dass stattdessen "v-on: input" verwendet werden sollte, wenn Sie "v-on: change" -Ereignisse für eine benutzerdefinierte vue-Komponente (einzelne Dateikomponente) registrieren möchten.
Andrés Biarge
93

Sie können dies tatsächlich vereinfachen, indem Sie die v-onAnweisungen entfernen :

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

Und verwenden Sie die watchMethode, um auf die Änderung zu warten:

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);
                }
            }
        }
    }
});
Stephen Hallgren
quelle
2
Können Sie automatisch einen Modellwechsel beobachten? Zum Beispiel für ein Formular mit mehreren Eingaben, das alle überwacht werden muss?
Eric Burel
@ EricBurel Ich weiß, das ist alt, aber die Antwort ist nein. Sie können nicht das gesamte Datenobjekt überwachen, an das alle Felder gebunden sind. Sie müssten jede einzelne Eigenschaft dieses Objekts einzeln überwachen, was diesen Ansatz für große Datensätze in Formularen mit vielen Feldern problematisch macht.
JohnC
1
@EricBurel Tatsächlich können Sie verschachtelte Objekte mit der Eigenschaft 'deep' auf 'true' sehen -> vuejs.org/v2/api/#watch
SanBen
27

Vue2: Wenn Sie Änderungen nur bei Eingabeunschärfe erkennen möchten (z. B. nachdem Sie die Eingabetaste gedrückt haben oder auf eine andere Stelle klicken), tun Sie dies (weitere Informationen hier ).

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

Wenn Sie Änderungen einzelner Zeichen (während der Benutzereingabe) erkennen möchten, verwenden Sie

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

Sie können auch @keyupund @inputEreignisse verwenden. Wenn Sie zusätzliche Parameter übergeben möchten, verwenden Sie in der Vorlage z @keyDown="foo($event, param1, param2)". Vergleich unten (bearbeitbare Version hier )

Kamil Kiełczewski
quelle
keyDown funktioniert nicht als 'Rücktaste' gedrückt. Also ist es besser, @input
Peretz30
In dieser Geige sehen wir, dass die @keyDown Rücktaste mit jsfiddle.net/rLzm0f1q funktioniert (ich sage jedoch nicht, dass @inputdas gut oder schlecht ist)
Kamil Kiełczewski
21

Sie sollten verwenden @input:

<input @input="handleInput" />

@input wird ausgelöst, wenn der Benutzer den Eingabewert ändert.

@change Wird ausgelöst, wenn der Benutzer den Wert geändert und die Eingabe aufgehoben hat (z. B. irgendwo außerhalb geklickt).

Sie können den Unterschied hier sehen: https://jsfiddle.net/posva/oqe9e8pb/

Peretz30
quelle
Was können Sie anstelle von @ sign verwenden? Gibt es irgendwo eine Regel dazu? Ich frage dies, weil in meinem Backend @ sign für etwas anderes reserviert ist.
FrenkyB