v模型更改时如何触发事件?


90

我正在尝试使用触发该foo()功能,@click但是如您所见,需要按两次单选按钮才能正确触发该事件。仅在第二次按下时捕获该值。

我想触发事件而不@click只是在v-model(srStatus)更改时触发事件。

这是我的小提琴:

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


1
小提琴的链接不再起作用。
FrenkyB

如果调用的目的foo()是进行非模板更改,请使用watcher
Saksham

这是为什么问题中需要代码的一个很好的例子。请尽可能恢复它并在此处显示。
伊瑟伍德

我希望我可以检索该问题的代码,但是已经在5年前了……幸运的是,我们有很好的答案
jnieto

Answers:


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:function对我不起作用。而是使用方法:{foo(){//做某事}}
文斯·班松

还要注意,如果要在自定义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我知道这很旧,但答案是否定的。您无法观察到所有数据字段绑定到的整个数据对象,您将需要分别观察该对象的每个属性,这使得这种方法对于包含许多字段的表单上的大记录是有问题的。
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 '18

在这个小提琴中,我们看到退格可以与@keyDown jsfiddle.net/rLzm0f1q一起使用(但是我不说这@input是不好还是很好)
KamilKiełczewski,

22

您应该使用@input

<input @input="handleInput" />

@input 用户更改输入值时触发。

@change 当用户更改值和未聚焦输入(例如在外部某处单击)时触发

您可以在这里看到区别:https : //jsfiddle.net/posva/oqe9e8pb/


您可以使用什么代替@ sign?对此是否有任何规定?我之所以这样问是因为在我的后端,@符号保留用于其他内容。
FrenkyB

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.