Angular 2中的复选框过滤器

时间:2017-08-18 20:04:11

标签: angular angular2-forms angular2-directives

我在表格中有一系列对象(任务)和两个复选框:" Night"," Day"。

我想要下一个场景:如果选中复选框Night,则只选择具有属性" Night"留在桌子上。如果选中复选框日,则只有具有属性" Day"留在桌子上("夜晚"如果复选框"夜晚"仍然被检查,任务也会被留下)。第三个复选框"重置"重置过滤器。

使用其他方式排序可能会更好,例如管道?

此处Plunkr。 这是一个代码:

@Component({
  selector: 'my-app',
  template: `
    <input type="checkbox" (click)="getNight()">Night
    <input type="checkbox" (click)="getDay()">Day
    <input type="checkbox">Uncheck
    <br><br>
    <table>
      <tr *ngFor="let task of tasks">
        <td>{{task.chkBoxImageUrl}}</td>
        <td>{{task.id}}</td>
        <td>{{task.val}}</td>
      </tr>
    </table>
  `,
})
export class App {
  tasks: Array<{chkBoxImageUrl: string, id: string, val: string, 
checked:boolean}> = [
    {chkBoxImageUrl: "http1", id: "item1", val: "Night", checked: false},
    {chkBoxImageUrl: "http2", id: "item2", val: "Day", checked: false},
    {chkBoxImageUrl: "http3", id: "item3", val: "Night", checked: false},
    {chkBoxImageUrl: "http4", id: "item4", val: "Day", checked: false},
    {chkBoxImageUrl: "http4", id: "item4", val: "Morning", checked: false},
    {chkBoxImageUrl: "http4", id: "item4", val: "Evening", checked: false}
  ];

  getNight() {
   console.log(this.tasks[2].val); // Night 
   // return this.tasks.filter(obj => obj.checked).map(obj => obj.val);
   if(this.tasks.val == 'Night') {
    return this.tasks.filter(obj => obj.checked).map(obj => obj.val == 'Night');
   } else {
     console.log('666666');
   }
  };
  getDay() {
   return this.tasks.filter(obj => obj.checked).map(obj => obj.val);
  };
  getCheckedCount(){
    return this.getCheckedValues().length;
  }
}

2 个答案:

答案 0 :(得分:1)

此处更新了plunkr

为了过滤tasks数组,需要访问NightDay复选框值。一种方法是创建实例变量nightday,并使用ngModel指令将它们绑定到相应的复选框。

组件:

night: boolean = false;
day: boolean = false;

查看:

<input type="checkbox" [(ngModel)]="night">Night
<input type="checkbox" [(ngModel)]="day">Day

nightday现在在检查时为true,在未选中时为false。这些值可用于过滤tasks数组。

组件:

interface Task {
  chkBoxImageUrl: string;
  id: string;
  val: string;
  checked:boolean;
}

getTasks(): Array<Task> {
  return this.tasks.filter(obj => this.night && obj.val === 'Night' || this.day && obj.val === 'Day');
}

查看:

<tr *ngFor="let task of getTasks()">

getTasks()方法返回一个任务数组,有条件地根据nightday的值进行过滤。然后将其绑定到视图。

要在选中取消选中复选框时清除复选框,nightday的值可以重置为false。

组件:

uncheck() {
  this.night = false;
  this.day = false;
}

查看:

<input type="checkbox" (click)="uncheck()">Uncheck

点击后,其他复选框将重置,这会更改getTasks()

的结果

答案 1 :(得分:0)

好吧,它可以使用一些重构,因为它不漂亮......但我在这里更新了你的plunker:https://plnkr.co/edit/PaHGSZW69Wl8tC1o2wEo?p=preview。您可能需要做更多的工作来清理我的代码。

我将html更改为:

<input type="checkbox" (click) = "filterTasks('Night')">Night
<input type="checkbox" (click) = "filterTasks('Day')">Day

因此它调用单个方法而不是两个不同的方法。

filterTask方法如下所示:

  filterTasks(value: string) {
    if (value === 'Night') { this.nightChecked = !this.nightChecked }
    if (value === 'Day') { this.dayChecked = !this.dayChecked }
   this.filteredTasks = this.tasks.filter(obj => 
                 (this.nightChecked && obj.val === "Night") || 
                 (this.dayChecked && obj.val === "Day"));
  }

这可能更好地使用数据绑定([(ngModel)]来设置两个属性而不是使用(click)事件。(我看到这是另一个答案所做的。)