angular - addEventListener 和 angular8 中的项目排序问题
问题描述
我试图通过单击列的标题在我的表中实现排序功能。它应该像这样工作:第一次点击该列中的项目应该按升序排列,第二次点击项目应该按降序排列。
这是我在html中的代码:
<thead>
<tr>
<th (click)="sorting('FirstName')" class="sorting" role="columnheader" tabindex="0" aria-controls="sample_1" rowspan="1" colspan="1" aria-label="Ime i prezime : activate to sort column ascending">
First Name
</th>
<th (click)="sorting('Email')" class="sorting" role="columnheader" tabindex="0" aria-controls="sample_1" rowspan="1" colspan="1" aria-label="Email : activate to sort column ascending">
Email
</th>
<th (click)="sorting('Username')" class="sorting" role="columnheader" tabindex="0" aria-controls="sample_1" rowspan="1" colspan="1" aria-label="Username: activate to sort column ascending">
Username
</th>
<th>
Actions
</th>
</tr>
</thead>
这是我在打字稿文件中的代码:
sorting(sortBy) {
this.sortBy = sortBy;
let tableHeaderItems = Array.from(document.querySelectorAll('.sorting'));
const handleClick = (e) => {
e.preventDefault();
e.stopPropagation();
console.log(e.currentTarget.classList);
if (e.currentTarget.classList.contains('sorting_asc')) {
e.currentTarget.classList.remove('sorting_asc');
e.currentTarget.classList.add('sorting_desc');
this.sortDirection = "desc";
}
else if (e.currentTarget.classList.contains('sorting_desc')) {
e.currentTarget.classList.remove('sorting_desc');
e.currentTarget.classList.add('sorting_asc');
this.sortDirection = "asc";
}
else {
tableHeaderItems.forEach(node => {
node.classList.remove('sorting_asc');
node.classList.remove('sorting_desc');
});
e.currentTarget.classList.add('sorting_asc');
this.sortDirection = "asc";
}
}
tableHeaderItems.forEach(node => {
node.addEventListener('click', handleClick)
});
this.service.getAll(this.sortBy, this.sortDirection);
}
我有问题 - 每次点击该功能只是一次,但const handleClick
被多次调用。当我第一次单击我的列时,const handleClick 内没有任何反应。当我第二次点击时,它只调用了一个。但是当我第三次点击我的专栏时,它调用了两次。如果我第十次单击我的列,它将调用 handleClick 九次。非常奇怪的行为。知道为什么会这样吗?
解决方案
你不需要使用 DOM。
<thead>
<tr>
<th (click)="sorting('FirstName')"
class="sorting"
[ngClass]="sortBy === 'FirstName' ? { 'sorting_asc': sortDirection === 'asc', 'sorting_desc': sortDirection === 'desc' } : null">
First Name
</th>
<th (click)="sorting('Email')"
class="sorting"
[ngClass]="sortBy === 'Email' ? { 'sorting_asc': sortDirection === 'asc', 'sorting_desc': sortDirection === 'desc' } : null">
Email
</th>
<th (click)="sorting('Username')"
class="sorting"
[ngClass]="sortBy === 'sorting' ? { 'sorting_asc': sortDirection === 'asc', 'sorting_desc': sortDirection === 'desc' } : null">
Username
</th>
<th>
Actions
</th>
</tr>
</thead>
sorting(sortBy) {
this.sortBy = sortBy;
this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
this.service.getAll(this.sortBy, this.sortDirection);
}
推荐阅读
- tableau-api - 如何在每一行的画面中显示饼图
- python - 在plot.ly-Dash隐藏Div中存储熊猫数据框字典?
- html - 如何检索动态框值(如果选中,则为真或假) - Angular 6
- react-admin - 在 API 平台管理员中保存为数组
- sql - 获取字符串的数字部分后前导零
- mysql - 两列sql之间的两次
- php - 您可以通过字符串中的名称获取变量的值吗?
- cordova - MobileFirst Cordova resolveLocalFileSystemURL() 抛出错误代码 5
- python - 导入错误:没有名为 xxxxxx 的模块,但有一个名为 xxxxxxx 的模块
- r - 从列中选择不同的值并在 R 中相应地写入值