Vue: .once не подходит для .self

Созданный на 2 февр. 2017  ·  6Комментарии  ·  Источник: vuejs/vue

Рассмотрим следующий элемент:

<div @click.self.once="eat">Eat <span>me</span></div>

Если мы нажмем на слово «Ешьте», все будет работать как положено. Мероприятие запускается один раз, и мы счастливы.

Но если мы нажмем на «меня», который является дочерним узлом, а затем нажмем на «Ешьте», событие никогда не будет запущено! Похоже, что .once слишком легко судить о событии как об увольнении.

Я думаю, что .once должен пометить его как выполненный, только если он действительно был запущен.

Все 6 Комментарий

Благодарим за подачу заявки. Следуйте Руководству по сообщению о

Зачем это нужно?

Привет,

Я не ОП, но думаю, мне удалось воспроизвести проблему, о которой он говорил. Я прикрепил JSFiddle ниже для иллюстрации.

JSFiddle

  1. Нажатие на слово «Ешьте» работает должным образом: событие запускается, и данные о фруктах обновляются.

  2. Если мы перезагрузим JSFiddle и щелкнем дочерний элемент span «я», а затем «Ешьте», данные фруктов не обновятся.

Надеюсь это поможет.

@boristhuy Спасибо за предоставление JSFiddle. Это именно то, что я имел в виду.

Это должно быть ошибкой. В настоящее время дескриптор события будет удален после его входа, на самом деле он действительно не вызывается из-за проверки модификаторов.

Возможно, нам нужно обновить код once для его поддержки.

нравиться

(function(){
  var called = false;
  return function($events){
    // modifiers check
    // called check
    if (called)return;
    called = true;
    // handler code
  }
})()

Что касается once используемого в функции рендеринга, это внесет критические изменения. Я пытаюсь найти способ решить эту проблему.

  1. [wip] обновить once genCode для шаблона.
  2. [готово] для once используемого в функции рендеринга on: {'~click': handle} , сохраните старую стратегию.
  3. [готово] существует ошибка в updateListeners для случая ниже:
    старый: '~click': handle
    новое: 'click': handle2

@defcc Я исправил это, вернув специальное значение из обработчиков, выполнение которых запрещено. Возможно, это не решит упомянутую вами ошибку (3), но при необходимости давайте рассмотрим ее в отдельном PR.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги