Как отключить жест HammerJS (Tap) для отключенных элементов - PullRequest
0 голосов
/ 24 октября 2019

Что я пытаюсь сделать:

  • используя жест (нажатие) в шаблонах
  • не запускать событие (нажатие), если элемент 'отключен'

это приведет к тому, что событие (касание) будет встроено во встроенное угловое событие (нажатие). т.е. (щелчок) не срабатывает, если элемент отключен

Здесь - пример кнопки стека, которая отключена. если вы нажмете / нажмете на элемент, мы все равно увидим событие

HTML-код

<button type="submit" (tap)="toggleButton()" [disabled]="true">
    Button 1
</button>

и метод переключения, который называется

toggleButton(){
    console.log('hello');
    this.buttonClicked = !this.buttonClicked;
}

, как вы заметите, нажатие кнопки (даже если она отключена) по-прежнемустрельбы. это нежелательно, учитывая, как (клик) работает. использование Click вместо касания не является приемлемым вариантом из-за задержки в 300 миллисекунд между двумя событиями, из-за которой приложения на мобильных устройствах выглядят вялыми.

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

однако это неперейти к условному отключению события. Согласно документации HammerJS, существует свойство enable, которое принимает логическое значение или функцию, которая возвращает логическое значение. Когда я пытался создать класс

import {HammerGestureConfig} from '@angular/platform-browser';
import {ElementRef} from '@angular/core';
declare var Hammer: any;

export class HammerGestureConfigCustomTap  extends HammerGestureConfig {
  e: HTMLElement;
  public buildHammer(element: HTMLElement) {
    this.e = element;
    const options = {};

    const mc = new Hammer(element, options);

    // keep default angular config
    mc.get('pinch').set({enable: true});
    mc.get('rotate').set({enable: true});
    mc.get('tap').set({enable: this.enabled });

    // retain support for angular overrides object
    for (const eventName in this.overrides) {
      mc.get(eventName).set(this.overrides[eventName]);
    }
    console.log(mc);
    return mc;
  }

  private enabled(): boolean {
    return !this.e.attributes['disabled'];
  }
}

и в модуле приложения, убедившись, что предоставил его

{ provide: HAMMER_GESTURE_CONFIG, useValue: HammerGestureConfigCustomTap},

Я получаю ошибки

Cannot read property 'indexOf' of undefined
at HammerGesturesPlugin.isCustomEvent (platform-browser.js:3771)
at HammerGesturesPlugin.supports (platform-browser.js:3664)
at EventManager._findPluginFor (platform-browser.js:2383)
at EventManager.addGlobalEventListener (platform-browser.js:2359)
at DefaultDomRenderer2.listen (platform-browser.js:2976)
at BaseAnimationRenderer.listen (animations.js:608)
at DebugRenderer2.listen (core.js:45965)
at listenToElementOutputs (core.js:42909)
at createViewNodes (core.js:44173)
at createRootView (core.js:44081)

Последнее средствобудет проходить через каждый метод обратного вызова, вызываемый в (tap), и добавлять логику, чтобы игнорировать, даже если элемент отключен. но это не очень хорошо работает, когда мы слушаем (коснитесь) события в более чем нескольких шаблонах.

Я надеюсь, что есть поразительно простой способ сделать это, которого я просто упускаю,Любая помощь будет оценена.

спасибо, любезно.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Если вы добавите событие к функции следующим образом:

(tap)="toggleButton($event)"

в вас вы можете использовать его как event.target, и атрибут будет отключен, и вы не сможете выполнить функцию, еслиотключенное значение - true.

if(event.target.disabled){
   ...do nothing

}

0 голосов
/ 24 октября 2019

Я нашел хороший трюк с css pointer-events

В вашем css вы можете установить что-то вроде:

button[disabled] {
  pointer-events: none
}

Это отключит все события кликов.

Прилагается Stabblitz Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...