Pertimbangkan elemen berikut:
<div @click.self.once="eat">Eat <span>me</span></div>
Jika kita mengklik kata "Makan", semuanya bekerja seperti yang diharapkan. Acara ini dipecat sekali dan kami senang.
Tetapi jika kita mengklik "saya", yang merupakan simpul anak, dan kemudian kita mengklik "Makan", acara tersebut tidak akan pernah dijalankan! Sepertinya .once
terlalu mudah untuk menilai acara yang dipecat.
Saya pikir .once
harus menandainya sebagai selesai hanya jika sebenarnya telah dipecat.
Terima kasih telah mengajukan masalah ini. Harap ikuti Panduan Pelaporan Masalah dan berikan JSFiddle atau JSBin minimal yang berisi serangkaian langkah yang dapat direproduksi yang dapat mengarah pada perilaku yang Anda jelaskan.
Hai,
Saya bukan OP tapi saya pikir saya berhasil mereproduksi masalah yang dia maksud. Saya melampirkan JSFiddle di bawah untuk ilustrasi.
Mengklik pada kata 'Makan' berfungsi seperti yang diharapkan: acara dipicu dan data buah diperbarui.
Jika kita memuat ulang JSFiddle dan mengklik elemen anak span 'me', lalu pada 'Eat', data buah tidak diperbarui.
Semoga ini membantu.
@boristhuy Terima kasih telah menyediakan JSFiddle. Inilah yang saya maksud.
Ini pasti bug. Saat ini pegangan acara akan dihapus setelah masuk, sebenarnya tidak dipanggil karena pemeriksaan pengubah.
Mungkin kita perlu memperbarui kode once
untuk mendukungnya.
Suka
(function(){
var called = false;
return function($events){
// modifiers check
// called check
if (called)return;
called = true;
// handler code
}
})()
Adapun once
digunakan dalam fungsi render, itu akan membawa perubahan yang merusak. Saya mencoba mencari cara untuk memperbaiki masalah ini.
once
genCode untuk template.once
digunakan dalam fungsi render on: {'~click': handle}
, pertahankan strategi lama.'~click': handle
'click': handle2
@defcc Saya memperbaikinya dengan mengembalikan nilai khusus dari penangan yang dicegah dari eksekusi. Ini mungkin tidak mengatasi bug (3) yang Anda sebutkan, tapi mari kita tangani dalam PR terpisah jika perlu.