Làm thế nào để kích hoạt một sự kiện khi mô hình v thay đổi?


90

Tôi đang cố gắng kích foo()hoạt chức năng với @clicknhưng như bạn thấy, cần nhấn nút radio hai lần để kích hoạt sự kiện một cách chính xác. Chỉ bắt giá trị lần thứ hai khi bạn nhấn ...

Tôi muốn kích hoạt sự kiện mà không @clickchỉ kích hoạt sự kiện khi v-model(srStatus) thay đổi.

đây là Fiddle của tôi:

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


1
liên kết fiddle không còn hoạt động.
FrenkyB

Nếu mục đích của cuộc gọi foo()là thực hiện các thay đổi không phải mẫu, hãy sử dụngwatcher
Saksham

Đây là một ví dụ tuyệt vời về lý do tại sao cần phải có mã trong câu hỏi . Vui lòng khôi phục nó nếu có thể và hiển thị nó ở đây.
isherwood

Tôi ước tôi có thể lấy lại mã cho câu hỏi, nhưng đã 5 năm trước rồi ... may mắn là chúng tôi có câu trả lời tốt
jnieto

Câu trả lời:


77

Điều này xảy ra vì clicktrình xử lý của bạn kích hoạt trước khi giá trị của nút radio thay đổi. changeThay vào đó, bạn cần lắng nghe sự kiện:

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

Ngoài ra, hãy chắc chắn rằng bạn thực sự muốn gọi điện foo()sẵn sàng ... có vẻ như có thể bạn không thực sự muốn làm điều đó.

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

Bạn sẽ xử lý Sliders như thế nào?
Royi

các sự kiện có sẵn được liệt kê trong tài liệu ở đâu. Tôi không thể tìm thấy nó?
toraman

Đây là những sự kiện chỉ tiêu chuẩn JavaScript mà bạn có thể tìm thấy ở đây: developer.mozilla.org/en-US/docs/Web/Events#Standard_events
pherris

Cảm ơn! Nhưng Ready: chức năng không hoạt động với tôi. Thay vào đó, các phương thức: {foo () {// do something}}
Vince Banzon

Cũng lưu ý rằng nếu bạn muốn đăng ký các sự kiện "v-on: change" trên thành phần vue tùy chỉnh (thành phần tệp đơn), thì nên sử dụng "v-on: input".
Andrés Biarge,

94

Bạn thực sự có thể đơn giản hóa điều này bằng cách xóa các v-onchỉ thị:

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

Và sử dụng watchphương pháp để lắng nghe sự thay đổi:

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
Bạn có thể xem tự động bất kỳ thay đổi mô hình nào không? Ví dụ: đối với một biểu mẫu có nhiều đầu vào mà tất cả đều cần được xem?
Eric Burel

@EricBurel Tôi biết điều này đã cũ, nhưng câu trả lời là không. Bạn không thể xem toàn bộ đối tượng dữ liệu mà tất cả các trường liên kết với nhau, bạn cần phải xem từng thuộc tính của đối tượng đó một cách riêng lẻ làm cho cách tiếp cận này trở nên khó khăn đối với các bản ghi lớn trên các biểu mẫu có nhiều trường.
JohnC

1
@EricBurel Trên thực tế, bạn có thể xem các đối tượng lồng nhau với thuộc tính 'deep' được đặt thành 'true' -> vuejs.org/v2/api/#watch
SanBen

28

Vue2: nếu bạn chỉ muốn phát hiện sự thay đổi về độ mờ đầu vào (ví dụ sau khi nhấn enter hoặc nhấp vào một nơi khác) hãy làm (thêm thông tin tại đây )

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

Nếu bạn muốn phát hiện các thay đổi ký tự đơn lẻ (trong khi người dùng nhập), hãy sử dụng

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

Bạn cũng có thể sử dụng @keyup@inputcác sự kiện. Nếu bạn muốn chuyển các tham số bổ sung sử dụng trong mẫu ví dụ @keyDown="foo($event, param1, param2)". So sánh bên dưới (phiên bản có thể chỉnh sửa tại đây )


keyDown không hoạt động sau khi nhấn 'backspace'. Vì vậy, tốt hơn là sử dụng @input
Peretz30.

Trong fiddle này chúng ta thấy rằng công trình xóa lùi với @keyDown jsfiddle.net/rLzm0f1q (tuy nhiên tôi không nói rằng @inputlà xấu hay tốt)
Kamil Kiełczewski

22

Bạn nên sử dụng @input:

<input @input="handleInput" />

@input kích hoạt khi người dùng thay đổi giá trị đầu vào.

@change kích hoạt khi người dùng thay đổi giá trị và đầu vào không tập trung (ví dụ: được nhấp vào một nơi nào đó bên ngoài)

Bạn có thể thấy sự khác biệt tại đây: https://jsfiddle.net/posva/oqe9e8pb/


Bạn có thể sử dụng gì thay cho ký hiệu @? Có quy tắc nào được viết ở đâu đó về điều này không? Tôi đang hỏi điều này vì trong phần phụ trợ của tôi, ký hiệu @ được dành riêng cho một thứ khác.
FrenkyB

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.