Рассмотрим следующий элемент:
<div @click.self.once="eat">Eat <span>me</span></div>
Если мы нажмем на слово «Ешьте», все будет работать как положено. Мероприятие запускается один раз, и мы счастливы.
Но если мы нажмем на «меня», который является дочерним узлом, а затем нажмем на «Ешьте», событие никогда не будет запущено! Похоже, что .once
слишком легко судить о событии как об увольнении.
Я думаю, что .once
должен пометить его как выполненный, только если он действительно был запущен.
Благодарим за подачу заявки. Следуйте Руководству по сообщению о
Привет,
Я не ОП, но думаю, мне удалось воспроизвести проблему, о которой он говорил. Я прикрепил JSFiddle ниже для иллюстрации.
Нажатие на слово «Ешьте» работает должным образом: событие запускается, и данные о фруктах обновляются.
Если мы перезагрузим JSFiddle и щелкнем дочерний элемент span «я», а затем «Ешьте», данные фруктов не обновятся.
Надеюсь это поможет.
@boristhuy Спасибо за предоставление JSFiddle. Это именно то, что я имел в виду.
Это должно быть ошибкой. В настоящее время дескриптор события будет удален после его входа, на самом деле он действительно не вызывается из-за проверки модификаторов.
Возможно, нам нужно обновить код once
для его поддержки.
нравиться
(function(){
var called = false;
return function($events){
// modifiers check
// called check
if (called)return;
called = true;
// handler code
}
})()
Что касается once
используемого в функции рендеринга, это внесет критические изменения. Я пытаюсь найти способ решить эту проблему.
once
genCode для шаблона.once
используемого в функции рендеринга on: {'~click': handle}
, сохраните старую стратегию.'~click': handle
'click': handle2
@defcc Я исправил это, вернув специальное значение из обработчиков, выполнение которых запрещено. Возможно, это не решит упомянутую вами ошибку (3), но при необходимости давайте рассмотрим ее в отдельном PR.