V-modeli değiştiğinde bir olay nasıl tetiklenir?


95

foo()Fonksiyonu ile ateşlemeye çalışıyorum @clickama gördüğünüz gibi olayı doğru bir şekilde ateşlemek için radyo düğmesine iki kez basmanız gerekiyor. Değeri sadece ikinci kez bastığınızda yakalayın ...

Olayı, @clickyalnızca v-model(srStatus) değiştiğinde tetiklemeden tetiklemek istiyorum.

işte benim Fiddle'ım:

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


1
keman bağlantısı artık çalışmıyor.
FrenkyB

Çağırmak niyet ederse foo()olmayan şablon değişiklikleri yapmaktır, bir kullanmawatcher
Saksham

Bu, soruda kodun neden gerekli olduğuna dair harika bir örnek . Lütfen mümkünse kurtarın ve burada gösterin.
isherwood

Keşke sorunun kodunu alabilseydim, ama 5 yıl önceydi ... neyse ki iyi cevaplarımız var
jnieto

Yanıtlar:


79

Bunun nedeni, clickişleyicinizin radyo düğmesinin değeri değişmeden önce tetiklenmesidir. Bunun changeyerine etkinliği dinlemeniz gerekir :

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

Ayrıca, gerçekten foo()hazır olarak aramak istediğinizden emin olun ... aslında bunu yapmak istemiyorsunuz gibi görünüyor.

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

Slider'larla nasıl başa çıkarsınız?
Royi

belgelerde listelenen mevcut olaylar nerede. Bulamıyorum
toraman

Bunlar, burada bulabileceğiniz standart JavaScript etkinlikleridir: developer.mozilla.org/en-US/docs/Web/Events#Standard_events
pherris

Teşekkürler! Ama Hazır: işlev benim için çalışmadı. Bunun yerine, yöntemler: {foo () {// bir şeyler yap}}
Vince Banzon

Ayrıca, özel bir vue bileşenine (tek dosya bileşeni) "v-on: change" olaylarını kaydetmek istiyorsanız, bunun yerine "v-on: input" kullanılması gerektiğini unutmayın.
Andrés Biarge

99

v-onDirektifleri kaldırarak bunu gerçekten basitleştirebilirsiniz :

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

Ve watchdeğişikliği dinlemek için yöntemi kullanın:

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
Herhangi bir model değişikliğini otomatik olarak izleyebilir misiniz? Örneğin, tümünün izlenmesi gereken birden çok girdiye sahip bir form için?
Eric Burel

@EricBurel Bunun eski olduğunu biliyorum ama cevap hayır. Tüm alanların bağlı olduğu tüm veri nesnesini izleyemezsiniz, bu nesnenin her bir özelliğini ayrı ayrı izlemeniz gerekir, bu da bu yaklaşımı çok alanlı formlardaki büyük kayıtlar için sorunlu hale getirir.
JohnC

1
@EricBurel Aslında 'deep' özelliği 'true' olarak ayarlanmış iç içe geçmiş nesneleri izleyebilirsiniz -> vuejs.org/v2/api/#watch
SanBen

29

Vue2: Yalnızca giriş bulanıklığındaki değişikliği tespit etmek istiyorsanız (örneğin, enter tuşuna bastıktan veya başka bir yere tıkladıktan sonra) yapın (daha fazla bilgi burada )

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

Tek karakter değişikliklerini tespit etmek istiyorsanız (kullanıcı yazarken)

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

Ayrıca kullanabilir @keyupve @inputolaylar. Ek parametreler geçirmek istiyorsanız, örneğin şablonda kullanın @keyDown="foo($event, param1, param2)". Aşağıdaki karşılaştırma (düzenlenebilir sürüm burada )


keyDown, 'backspace'e basıldığında çalışmıyor. Bu yüzden @input
Peretz30

Bu @keyDown kemanta geri almanın jsfiddle.net/rLzm0f1q ile çalıştığını görüyoruz (ancak @inputbunun kötü ya da iyi olduğunu söylemiyorum )
Kamil Kiełczewski

24

Kullanmalısınız @input:

<input @input="handleInput" />

@input kullanıcı giriş değerini değiştirdiğinde yanar.

@change kullanıcı değeri değiştirdiğinde ve girdiyi odaklamadığında patlar (örneğin, dışarıda bir yere tıklandığında)

Farkı burada görebilirsiniz: https://jsfiddle.net/posva/oqe9e8pb/


@ İşareti yerine ne kullanabilirsiniz? Bununla ilgili bir yerde yazılmış bir kural var mı? Bunu soruyorum çünkü arka ucumda @ işareti başka bir şey için ayrılmış.
FrenkyB

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.