Задать вопрос
@mantovpinets

Почему $event.target ячейка, а не строка?

Всем доброго времени суток.

Юзаю Angular 4. Мне нужно повесить обработчик событий на клик по строке таблицы. Пишу следующим образом:

<tbody>
    <tr data-id="{{course.id}}" *ngFor="let course of coursesList" data-open="false" (click)="showListOfListners($event)">
          <td>{{course.Number}}</td>
          <td>{{course.name}}</td>
          <td>{{course.Start | date: "dd.MM.yy"}}</td>
          <td>{{course.Finish | date: "dd.MM.yy"}}</td>
    </tr>
</tbody>


Но когда начинаю писать обработчик событий, то у меня по клику на строку в $event.target находится ячейка, по которой кликнули, а не сама строка.
showListOfListners(event:any): void {
		console.log(event.target);
		console.log(event);
		this.test.nativeElement.insertAdjacentHTML("beforeend", '<div>two</div>');	
	}

Как пофиксить этот косяк?
  • Вопрос задан
  • 321 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
search
@search
мама говорит что я особенный
target - это тот компонент, который породил событие "клик". Если вам нужно знать какой компонент его поймал, то юзайте event.currentTarget. В вашем случае это будет строка.

Но в любом случае код выглядит так, будто его писал человек, одержимый бесом jQuery.

Вот так бы выглядел код, если бы его писал нерадивый angular программист, забывший про jQuery навсегда:
(в любом случае это лучше, чем пример в тексте вопроса, так как он не нуждается в каких-то дополнительных выкрутасах в контроллере и изменения дома не будут неожиданно потеряны в случае перерисовки компонента самим ангуляром по событию, не зависящиму от вас)
<tbody>
  <ng-container *ngFor="let course of coursesList">
    <tr  (click)="course.isOpened != course.isOpened">
          <td>{{course.Number}}</td>
          <td>{{course.name}}</td>
          <td>{{course.Start | date: "dd.MM.yy"}}</td>
          <td>{{course.Finish | date: "dd.MM.yy"}}</td>
    </tr>
    <tr *ngIf="course.isOpened">
       <td colspan="4">Here we go</td>
    </tr>
  </ng-container>
</tbody>

Нерадивый, потому что тут мутируется объект курса, что не есть хорошо.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
Это не косяк. Читайте документацию.
По идее, Вы можете написать следующий код: (click)="showListOfListners(course), и уже работать с конкретным объектом Course.

// EDIT: неправильно понял вопрос

Тогда надо проверить следующее условие: если target не является элементом tr, тогда вызвать target.closest('tr').
Почему попадает ячейка в event.target? Так работает событийная модель DOM. Подробнее можете прочитать в интернете (например, тут).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы