ionic2 тап против клика

Я начинаю с angular2 и ionic2;

В ionic2 у меня есть кнопка, которая вызывает метод моего компонента. Как это:

<button secondary clear large>
</button>

Должен ли я использовать (click) - angular2 ИЛИ (tap) - ionic2?

Как это:

(click)

<button secondary clear large (click)="pause()">
</button>

(tap)

<button secondary clear large (tap)="pause()">
</button>

Есть какая-то разница? Вы можете узнать о (tap) в http://ionicframework.com/docs/v2/components/#gestures

Спасибо.


person José Barbosa    schedule 22.09.2016    source источник
comment
Потому что Ionic 2 построен на основе Angular 2. Поэтому внутри кнопки вы должны использовать событие (щелчок).   -  person nahoang    schedule 22.09.2016


Ответы (5)


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

Обратите внимание, что в некоторых версиях ionic событие (click) не будет выполняться на iOS. Поэтому рекомендуется использовать (tap).

person Ivar Reukers    schedule 22.09.2016
comment
Вы указали точную причину, по которой мне нужно использовать касание в некоторых местах моего приложения. Если вы используете (click) и (press), то оба выполняются при «нажатии». Если вы используете (tap) и (press), это не так. - person Gabe O'Leary; 01.12.2016
comment
Вы когда-нибудь слышали о .stopPropagation(); ? - person JoeriShoeby; 01.03.2017
comment
@JoeriShoeby - пробовал event.stopPropagation() в ячейках таблицы, которые скользят, чтобы удалить, и щелкают, чтобы показать подробности. При использовании click() он показывал детали независимо, а stopPropagation() не имел никакого эффекта. Замена на tap() вместо этого устранила проблему. - person mc01; 14.11.2017

Я думаю, это действительно зависит от того, насколько «нативным» вы хотите, чтобы пользовательский интерфейс был.

Событие (tap) поступает из библиотеки Hammer.js. Если вы посмотрите на ссылку, вы увидите требования, которые должны быть выполнены, чтобы событие касания сработало.

Первое требование, о котором следует помнить, — это параметр time со значением по умолчанию 250 мс. Это означает, что если нажатие превышает 250 мс, событие не сработает.

Второе требование, о котором следует помнить, — это параметр threshold со значением по умолчанию 2 (не уверен, что это за единица измерения, возможно, пиксели). Это означает, что если движение прессы больше 2, событие не сработает. Например. двигая пальцем в направлении слева направо над экраном, а затем нажимая элемент во время этого движения, событие может не срабатывать в зависимости от скорости движения.

Однако

Событие (click) по-прежнему будет срабатывать в обоих случаях, на которые я только что указал, при условии, что когда нажатие будет отпущено, оно все еще находится внутри целевого элемента.


В начале причина, по которой я сказал «это действительно зависит», основана на том, как другие приложения обрабатывают эти сценарии (каждое приложение потенциально может отличаться, и оно также может отличаться в зависимости от результата варианта использования).

Насколько мне известно, кнопки в приложениях для Android, которые я проверял (с визуальным результатом, например, с навигацией или всплывающими сообщениями), работают так же, как событие (click), предоставляемое Angular.

Я не могу комментировать, как работают приложения IOS, используя те же принципы, которые я не тестировал.

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

person Will.Harris    schedule 22.09.2016
comment
ionic зависит от библиотеки Hammer.js? - person José Barbosa; 24.09.2016
comment
Ионные жесты делают да. ionicframework.com/docs/v2/components/#gestures В других бета-версиях документация, в которой они упоминали об этом, но похоже, что в последней версии этого нет - person Will.Harris; 26.09.2016

Я хотел бы добавить, что вы можете использовать событие (tap) для таких элементов, как button, a, но для элементов, не являющихся кнопками, полезен атрибут tappable:

Если вам нужны мгновенные щелчки по элементам, не являющимся кнопками, вы должны добавить директиву tappable к этому элементу, иначе он будет иметь задержку 300 мс. Например:

<div tappable (click)="someHandler()">Click me</div>
person rtrujillor    schedule 15.09.2017
comment
но вы также можете использовать tap на кнопках. Так что лучше? tap() или click() + tappable? - person Dani; 06.07.2018
comment
Зависит от элемента html, для элементов кнопки и (ссылки) я бы использовал событие (tap), но для других других элементов html я бы использовал директиву tappable + (click) eventç - person rtrujillor; 06.09.2018


В дополнение к вопросу, получившему наибольшее количество голосов, я хотел бы отметить, что (tap) обрабатывает $event по-разному, когда используется в качестве параметра. Если я правильно помню, при использовании (tap) атрибутом target в $event будет элемент, на который вы фактически нажали, а не элемент, который имеет привязку события (tap). Это было бы актуально, если у вас есть дочерние элементы внутри вашего элемента с привязанным к нему (tap).

person DFSFOT    schedule 14.03.2018
comment
Значит ли это, что когда у меня есть <ion-list> с событием касания, и я касаюсь дочернего элемента <ion-item>, я могу видеть из события, какой элемент был нажат, вместо того, чтобы копировать и вставлять функции касания? - person Ivar Reukers; 17.04.2018
comment
@Ivaro18, переменная $event будет содержать элемент, на который вы нажали, а это означает, что если вам нужен элемент <ion-list>, вам придется отслеживать его в родительских элементах, что, на мой взгляд, очень хакерская вещь. Вы можете обойти эту плохую практику в определенных ситуациях, передав фактические данные, которые вам нужны, если они доступны, вместо использования $event. - person DFSFOT; 23.04.2018