【问题标题】:Filter by checkbox in angular 5按角度 5 中的复选框过滤
【发布时间】:2018-08-23 13:37:49
【问题描述】:

我能够使用管道在输入字段上实现过滤器。但我无法使用复选框过滤器这样做。

以下是我的输入过滤器代码。

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
    name: 'filter'
})
export class FilterPipe implements PipeTransform {

    transform(users: any, searchTerm: any): any {
        // check if search term is undefined
        if (searchTerm === undefined) {
            return users;
        }
        // return updated users array
        return users.filter(function(user) {
            return user.name.toLowerCase().includes(searchTerm.toLowerCase());
        });
    }
}

用户组件.html

<input type="text" [(ngModel)]="searchTerm">

<table>
    <tr *ngFor="let user of users | filter: searchTerm">
        <td>{{user.name}}</td>
        <td>{{user.type}}</td>
    </tr>
</table>

现在对于type,我想过滤复选框选择。

<tr>
    <td *ngFor="let role of roles">
        <label>{{role.type}}</label>
        <input type="checkbox">
    </td>
</tr>

在输入字段中,我可以使用[(ngModel)] 获取值,但在复选框中,我无法这样做。 请让我知道如何使用复选框选择来实现。 谢谢

【问题讨论】:

  • 您的选择过滤器应该如何工作?如果单击其中一个复选框,您期望会发生什么?
  • @DiabolicWords 我有用户名和类型的列表。我想在选中复选框时使用studentadmin 过滤列表。 studentadmin 有 2 个不同的复选框

标签: angular pipe


【解决方案1】:

组件代码:

public roleList = {studentRole:false,adminRole:false,staffRole:false};

HTML 代码:

<tr>
    <td *ngFor="let user of userList | roleFilter:roleList">
        {{user.name}} - {{user.roleType}}
    </td>
</tr>

<label>Student</label>
<input [(ngModel)] = "roleList.studentRole" type="checkbox">

<label>Admin</label>
<input [(ngModel)] = "roleList.adminRole" type="checkbox">

<label>Staff</label>
<input [(ngModel)] = "roleList.staffRole" type="checkbox">

管道代码:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
    name: 'roleFilter'
})
export class RoleFilter implements PipeTransform {

    transform(userList: any,roleList:any): any {
        if(!roleList.studentRole && !roleList.adminRole && !roleList.staffRole){
            return userList;
        }

        return userList.filter(user => 
                                (roleList.studentRole && user.roleType == "student") 
                                || (roleList.adminRole && user.roleType == "admin")
                                || (roleList.staffRole && user.roleType == "staff"))
    }
}

【讨论】:

  • 我想你误会了。实际上,我有 1000 个不同角色的用户列表 studentadminstaff。现在我想根据复选框选择的角色过滤列表。
  • 知道了。在这种情况下,如果角色数量是动态的或太高而不是复选框,则选择框会很有帮助。无论如何,我已经更新了我的代码..
【解决方案2】:

首先,当涉及到状态切换时,您不应该使用复选框。在这种情况下,请始终使用单选按钮。

将此代码放入您的 HTML 模板中

<label>
  <input type="radio" name="role-group" id="admin" value="admin" [checked]="searchTerm==='admin'" [(ngModel)]="searchTerm">Admin
</label>
<label>
  <input type="radio" name="role-group" id="student" value="student" [checked]="searchTerm==='student'" [(ngModel)]="searchTerm">Student
</label>
<label>
  <input type="radio" name="role-group" id="staff" value="staff" [checked]="searchTerm==='staff'" [(ngModel)]="searchTerm">Staff
</label>

并确保 searchTerm 是您的打字稿文件的成员。例如:

private searchTerm: string = 'search';

应该可以。如果您现在单击其中一个单选按钮 searchTerm 已设置,Angular 将使用您的管道进行过滤。此外,如果您手动输入“admin”、“student”或“staff”,则会激活相应的单选按钮。

【讨论】:

  • @DiabollicWords 我想用复选框来做,因为我还必须过滤两个或所有角色,而不仅仅是一个角色。
  • 嗯,这让它变得更复杂了。我可以向您展示如何使用复选框执行与单选按钮相同的操作。但这对您没有帮助,因为您的管道在当前状态下无法处理 3 个不同的搜索参数。我建议你先尝试调整你的管道。这样您就可以输入例如将“admin | staff”添加到您的输入字段中,它会过滤所有具有这些角色的用户。如果你做到了,请回到这篇文章,我将向你展示如何通过复选框输入这些值。
【解决方案3】:

是的,你可以像这样使用 ngModel:

<input type="checkbox" name="admin" id="admin" [(ngModel)]='isAdmin'>
<input type="checkbox" name="student" id="student" [(ngModel)]='isStudent'>

我在这里有一篇关于过滤的博文:https://blogs.msmvps.com/deborahk/filtering-in-angular/

它展示了如何使用代码而不是管道进行过滤,以便您可以更轻松地过滤复选框值。

【讨论】:

  • 你能告诉我复选框中的这个 [(ngModel)] 如何适用于所有不同的复选框。我读了你的博客,但没有完全理解。
  • 不确定我理解您所说的“完全不同”是什么意思?但我在上面添加了第二个复选框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2020-11-30
  • 2017-08-16
相关资源
最近更新 更多