javascript - 我应该使用什么来根据过滤器选择获取更新的计数?
问题描述
我正在使用 CSV 上传并显示表格中的数据以及使用自定义表格过滤器管道功能。
如何获得基于过滤器部分的过滤计数?
例如,一旦您上传数据,考虑到您的 csv 有 7 行;它将显示 7 条记录中的 7 条记录。
当您根据性别男性/女性进行过滤时,我应该得到 Showing 4 of 7 Records 或 Showing 3 of 7 Records
我在下面尝试了我没有得到结果。
Showing {{filteredUsers.length}} of {{dataList.length}} Records
如果我这样做:
<strong class="ml-3" *ngFor="let record of dataList | tableFilter: form.value as filteredUsers">
Showing {{filteredUsers.length}} of {{dataList.length}} Records
</strong>
我也根据过滤器选择来更新计数 n,但它会根据行数重复,所以会出现 7 次。
app.component.html
<form #form="ngForm">
<select class="form-control form-control-sm" name="gender" ngModel>
<option value="" selected>All</option>
<option value="male">Male</option>
<option value="female">Female</option>
</select>
</form>
<tr *ngFor="let record of dataList | tableFilter: form.value as filteredUsers">
<td> {{record.name}} </td>
<td> {{record.gender}} </td>
</tr>
直播:https ://stackblitz.com/edit/angular-csv-parser-aazvnq?file=app%2Fapp.component.html
CSV 样本
解决方案
我建议采用与 Nicholas 的解决方案略有不同的方法 - 不是每次进行更改时都更新两个项目,而是可以让管道函数更新表示计数的变量 - 这样,一个地方负责处理计数和过滤,这需要在组件中添加一个对象:
countObj = { count: 0 };
在模板中:
Showing {{countObj.count}} Records
...
<tr *ngFor="let record of dataList | tableFilter: form.value:countObj">
在变换函数中:
transform(list: any[], filters: Object, countObj: any) {
const keys = Object.keys(filters).filter(key => filters[key]);
const filterUser = user => keys.every(key => user[key] === filters[key]);
if (keys.length) {
const res = list.filter(filterUser);
countObj.count = res.length;
return res;
} else {
countObj.count = list.length;
return list;
}
}
推荐阅读
- python - 查找图中的路径数
- image - 如何使用硒单击这些框
- ssl - AWS ELB 支持的 Nginx 存在延迟问题,有没有办法在 ELB 中添加 gzip、缓存、SSL 配置?ELB 支持 gzip 吗?
- javascript - Javascript:如果检测到输入键,如何将字符串放入新行
- android - 将应用程序与位于内部存储目录而不是资产目录中的文件捆绑在一起?
- reactjs - 反应 {useState,useEffect)。React 使用单个“useEffect”渲染的频率如何,这会在回调中触发“setState”?
- javascript - javascript中的提升方法
- django - 谷歌云存储与谷歌云 CDN
- python - 代理配置在 Python 中不起作用
- python - 使用不同的参数和输出文件名在循环中运行scrapy spider