v-modelが変更されたときにイベントを発生させる方法は?


90

私はでfoo()関数を@click起動しようとしていますが、ご覧のとおり、イベントを正しく起動するには、ラジオボタンを2回押す必要があります。2回目に押すだけで値をキャッチします...

(srStatus)が変更された@clickときにイベントを発生させるだけでなく、イベントを発生させたいv-model

ここに私のフィドルがあります:

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


1
フィドルリンクが機能しなくなった。
FrenkyB

呼び出しの目的がfoo()テンプレート以外の変更を行うことである場合は、aを使用しますwatcher
Saksham

これは、質問でコードが必要な理由の良い例です。可能であれば回復して、ここに表示してください。
isherwood

質問のコードを取得できたらいいのですが、それは5年前のことです...幸いにも良い答えがあります
jnieto

回答:


77

これclickは、ラジオボタンの値が変更される前にハンドラーが起動するために発生します。change代わりにイベントをリッスンする必要があります:

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

また、あなたが本当にfoo()準備ができていることを望んでいることを確かめてください...多分あなたは実際にそれをしたくないと思われるかもしれません。

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

スライダーをどのように扱いますか?
Royi

ドキュメントに記載されている使用可能なイベントはどこにありますか。見つかりませんか?
トラマン2017

これらは、次の場所にある標準のJavaScriptイベントにすぎません:developer.mozilla.org/en-US/docs/Web/Events#Standard_events
pherris

ありがとう!しかし、Ready:関数は私には機能しませんでした。代わりに、methods:{foo(){// do something}}
Vince Banzon

また、カスタムvueコンポーネント(単一ファイルコンポーネント)で「v-on:change」イベントを登録する場合は、代わりに「v-on:input」を使用する必要があります。
アンドレス・Biarge

94

v-onディレクティブを削除することで、これを実際に簡素化できます。

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

watchメソッドを使用して変更をリッスンします。

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
モデルの変更を自動的に監視できますか?たとえば、すべてを監視する必要がある複数の入力を持つフォームの場合はどうでしょうか。
Eric Burel 2017

@EricBurel私はこれが古いことを知っていますが、答えはノーです。すべてのフィールドがバインドされているデータオブジェクト全体を監視することはできません。そのオブジェクトのすべてのプロパティを個別に監視する必要があるため、多くのフィールドを持つフォームの大きなレコードに対してこのアプローチは問題になります。
JohnC

1
@EricBurel実際には、「deep」プロパティを「true」に設定してネストされたオブジェクトを見ることができます-> vuejs.org/v2/api/#watch
SanBen

28

Vue2:入力ブラーの変化のみを検出したい場合(たとえば、Enterキーを押すか、他の場所をクリックした後)、次のようにします(詳細はこちら

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

(ユーザーの入力中に)単一の文字の変更を検出したい場合

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

使用することもできます@keyupし、@inputイベント。追加のパラメータを渡したい場合は、テンプレートなどで使用します @keyDown="foo($event, param1, param2)"。以下の比較(ここで編集可能なバージョン)


keyDownが「バックスペース」を押したときよりも機能しない したがって、@ inputを使用することをお勧めします
Peretz30

このフィドルでは、バックスペースが@keyDown jsfiddle.net/rLzm0f1qで機能することがわかります(ただし、それ@inputが悪いまたは良いとは言いません)
KamilKiełczewski18年

22

あなたは使うべきです@input

<input @input="handleInput" />

@input ユーザーが入力値を変更したときに発生します。

@change ユーザーが値を変更して入力のフォーカスを外したときに発生します(たとえば、外のどこかをクリックしたとき)

ここで違いを確認できます:https : //jsfiddle.net/posva/oqe9e8pb/


@記号の代わりに何を使用できますか?これについてどこかで書かれたルールはありますか?私のバックエンドでは、@記号が他の何かのために予約されているため、これを求めています。
FrenkyB

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.