v-model이 변경 될 때 이벤트를 발생시키는 방법은 무엇입니까?


95

나는를 사용하여 foo()기능을 실행 하려고하는데 @click, 알 수 있듯이 이벤트를 올바르게 실행하려면 라디오 버튼을 두 번 눌러야합니다. 두 번째로 누를 때만 값을 잡습니다.

(srStatus)가 변경 @click될 때만 이벤트를 시작하지 않고 이벤트를 시작하고 싶습니다 v-model.

여기 내 바이올린이 있습니다.

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


1
바이올린 링크가 더 이상 작동하지 않습니다.
FrenkyB

부름의 목적이 foo()템플릿이 아닌 변경을하는 watcher
것이라면

이것은 질문에 코드가 필요한 이유에 대한 좋은 예입니다 . 가능하면 복구하여 여기에 보여주세요.
isherwood

질문에 대한 코드를 검색 할 수 있으면 좋겠지 만 이미 5 년 전이었습니다 ... 운 좋게도 좋은 답변이 있습니다
jnieto

답변:


79

이것은 click라디오 버튼의 값이 변경되기 전에 핸들러가 실행되기 때문에 발생합니다 . change대신 이벤트 를 수신해야합니다 .

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

또한, 정말로 foo()준비 상태 로 전화하고 싶은지 확인하십시오 ... 실제로 그렇게하고 싶지 않은 것 같습니다.

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

슬라이더를 어떻게 처리 하시겠습니까?
Royi

문서에 나열된 사용 가능한 이벤트는 어디에 있습니까? 찾을 수 없습니까?
toraman

다음은 여기에서 찾을 수있는 표준 JavaScript 이벤트
일뿐입니다

감사! 하지만 Ready : 기능이 작동하지 않았습니다. 대신, 메소드 : {foo는 () {// 무언가}}
빈스 Banzon

또한 사용자 지정 vue 구성 요소 (단일 파일 구성 요소)에 "v-on : change"이벤트를 등록하려면 대신 "v-on : input"을 사용해야합니다.
Andrés Biarge 19 년

99

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

@EricBurel 나는 이것이 오래되었다는 것을 알고 있지만 대답은 아니오입니다. 모든 필드가 바인딩 된 전체 데이터 개체를 볼 수는 없으며 해당 개체의 모든 단일 속성을 개별적으로 관찰해야이 접근 방식이 많은 필드가있는 양식의 큰 레코드에 문제가됩니다.
JohnC

1
@EricBurel 실제로 'deep'속성이 'true'로 설정된 중첩 된 개체를 볼 수 있습니다 .--
SanBen

29

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나쁜 또는 좋은)
카밀 Kiełczewski

24

다음을 사용해야합니다 @input.

<input @input="handleInput" />

@input 사용자가 입력 값을 변경할 때 발생합니다.

@change 사용자가 값을 변경하고 입력 초점을 해제하면 실행됩니다 (예 : 외부에서 클릭).

https://jsfiddle.net/posva/oqe9e8pb/ 에서 차이점을 확인할 수 있습니다.


@ 기호 대신 무엇을 사용할 수 있습니까? 이것에 대해 어딘가에 쓰여진 규칙이 있습니까? 내 백엔드에서 @ 기호가 다른 것을 위해 예약되어 있기 때문에 이것을 묻습니다.
FrenkyB

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.