Як запускати подію при зміні v-моделі?


90

Я намагаюся запустити foo()функцію за допомогою, @clickале, як ви бачите, потрібно два рази натиснути перемикач, щоб правильно запустити подію. Вловлюйте значення лише вдруге, коли ви натискаєте ...

Я хочу запустити подію, не @clickзапускаючи подію лише тоді, коли v-model(srStatus) змінюється.

ось моя скрипка:

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


1
скрипкове посилання більше не працює.
FrenkyB

Якщо метою дзвінка foo()є внести не шаблонні зміни, використовуйте awatcher
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();
},

Як би ви поводились з повзунками?
Рої,

де доступні події, перелічені в документації. Не можу знайти?
toraman

Це лише стандартні події JavaScript, які ви можете знайти тут: developer.mozilla.org/en-US/docs/Web/Events#Standard_events
pherris

Дякую! Але Ready: функція у мене не працювала. Натомість методи: {foo () {// щось робити}}
Вінс Банзон,

Також зверніть увагу, що якщо ви хочете зареєструвати події "v-on: change" у користувацькому компоненті vue (компонент одного файлу), замість цього слід використовувати "v-on: input".
Andrés 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
Чи можете ви автоматично спостерігати за будь-якою зміною моделі? Наприклад, для форми з кількома входами, за якою потрібно переглядати все?
Ерік Бурель,

@EricBurel Я знаю, що це старе, але відповідь - ні. Ви не можете переглядати весь об’єкт даних, до якого пов’язані всі поля, вам потрібно буде спостерігати за кожним властивістю цього об’єкта окремо, роблячи цей підхід проблематичним для великих записів у формах з великою кількістю полів.
JohnC

1
@EricBurel Насправді ви можете переглядати вкладені об'єкти із властивістю 'deep', встановленою на 'true' -> 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)". Порівняння нижче (редагована версія тут )


keyDown не працює, ніж натиснуто "backspace". Тож краще використовувати @input
Peretz30

У цій скрипці ми бачимо, що backspace працює з @keyDown jsfiddle.net/rLzm0f1q (однак я не кажу, що @inputце погано чи добре)
Каміль Kiełczewski

22

Ви повинні використовувати @input:

<input @input="handleInput" />

@input спрацьовує, коли користувач змінює вхідне значення.

@change спрацьовує, коли користувач змінив значення та розфокусував введення (наприклад, клацнув десь зовні)

Ви можете побачити різницю тут: https://jsfiddle.net/posva/oqe9e8pb/


Що можна використовувати замість знака @? Чи десь про це написано якесь правило? Я прошу це, тому що у моєму сервісному центрі знак @ зарезервований для чогось іншого.
FrenkyB

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.