जब वी-मॉडल बदलता है तो किसी घटना को कैसे फायर किया जाए?


90

मैं foo()फ़ंक्शन को आग लगाने की कोशिश कर रहा हूं , @clickलेकिन जैसा कि आप देख सकते हैं, घटना को सही ढंग से फायर करने के लिए दो बार रेडियो बटन दबाएं। केवल दूसरी बार आपके द्वारा दबाए गए मान को पकड़ें ...

मैं इस घटना को बिना घटना के आग देना चाहता हूं @clickजब v-model(srStatus) बदलता है।

यहाँ मेरी पहेली है:

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


1
फिडल लिंक अब काम नहीं कर रहा है।
FrenkyB

यदि कॉल foo()करने का इरादा गैर टेम्पलेट परिवर्तन करना है, तोwatcher
सकाम

यह एक महान उदाहरण है कि प्रश्न में कोड की आवश्यकता क्यों है । कृपया यदि संभव हो तो इसे पुनर्प्राप्त करें और इसे यहां दिखाएं।
ईशरवुड

मुझे लगता है मैं प्रश्न के लिए कोड को पुनः प्राप्त पाती है, लेकिन यह 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();
},

आप स्लाइडर को कैसे संभालेंगे?
रॉय

दस्तावेज़ में उपलब्ध इवेंट्स कहाँ सूचीबद्ध हैं। मैं यह नहीं मिल सकता है?
toraman

ये केवल मानक जावास्क्रिप्ट घटनाएँ हैं, जिन्हें आप यहाँ पा सकते हैं: developer.mozilla.org/en-US/docs/Web/Events#Standard_events
pherris

धन्यवाद! लेकिन तैयार: समारोह मेरे लिए काम नहीं किया। इसके बजाय, विधियाँ: {foo () {// do something}}
विंस बैनजन

यह भी ध्यान दें कि यदि आप कस्टम vue घटक (एकल फ़ाइल घटक) पर "v-on: change" घटनाओं को पंजीकृत करना चाहते हैं, तो इसके बजाय "v-on: input" का उपयोग किया जाना चाहिए।
एंड्रेस बायार्ज सेप

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
क्या आप अपने आप कोई मॉडल परिवर्तन देख सकते हैं? उदाहरण के लिए कई इनपुट के साथ एक फॉर्म के लिए जिसे सभी को देखना होगा?
एरिक ब्यूरल

@EricBurel मुझे पता है कि यह पुराना है, लेकिन इसका जवाब नहीं है। आप पूरे डेटा ऑब्जेक्ट को नहीं देख सकते हैं सभी फ़ील्ड बाध्य हैं, आपको उस ऑब्जेक्ट के प्रत्येक और प्रत्येक एकल गुण को व्यक्तिगत रूप से देखने की आवश्यकता होगी जो इस दृष्टिकोण को बहुत सारे फ़ील्ड के साथ बड़े रिकॉर्ड के लिए समस्याग्रस्त बना रहा है।
जॉन सी सी

1
@EricBurel वास्तव में आप नेस्टेड ऑब्जेक्ट्स को 'डीप' प्रॉपर्टी के साथ 'ट्रू' में सेट करके देख सकते हैं -> vuejs.org/v2/api/#watch
SanBen

28

Vue2: यदि आप केवल इनपुट ब्लर पर परिवर्तन का पता लगाना चाहते हैं (जैसे प्रेस के बाद प्रवेश करें या कहीं और क्लिक करें) (अधिक जानकारी यहां करें )

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

यदि आप एकल चरित्र परिवर्तन (उपयोगकर्ता टाइपिंग के दौरान) का उपयोग करना चाहते हैं

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

आप उपयोग @keyupऔर @inputईवेंट भी कर सकते हैं । यदि आप टेम्पलेट में अतिरिक्त मापदंडों का उपयोग करना चाहते हैं, जैसे @keyDown="foo($event, param1, param2)"। नीचे तुलना ( यहाँ संपादन योग्य संस्करण )


कीडाउन 'बैकस्पेस' की तुलना में काम नहीं कर रहा है। इसलिए
Peretz30

इस फिडेल में हम देखते हैं कि बैकस्पेस @keyDown jsfiddle.net/rLzm0f1q के साथ काम करता है (हालांकि मैं यह नहीं कहता कि @inputयह बुरा है या अच्छा है)
कामिल कील्वेज़ेस्की

22

आपको उपयोग करना चाहिए @input:

<input @input="handleInput" />

@input जब उपयोगकर्ता इनपुट मूल्य बदलता है तो आग लग जाती है।

@change उपयोगकर्ता द्वारा बदले गए मूल्य और अनफ़ोकस इनपुट के दौरान आग लगना (उदाहरण के लिए कहीं बाहर क्लिक किया गया)

आप यहां अंतर देख सकते हैं: https://jsfiddle.net/posva/oqe9e8pb/


@ साइन के बजाय आप क्या उपयोग कर सकते हैं? क्या इस बारे में कहीं कोई नियम लिखा गया है? मैं यह इसलिए पूछ रहा हूं क्योंकि मेरे बैकएंड में, @ साइन कुछ और के लिए आरक्षित है।
FrenkyB

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.