如何过滤从Angular中的复选框值排序的列表?

杰里米·卢卡斯(Jeremy Lucas)

我已经看到了一些复选框的想法和策略,但是似乎无法使它在我的特定情况下起作用。

我是Angular的新手,但正在尝试构建一个健身Webapp。我想做的是使用复选框过滤显示在锻炼列表中的锻炼(锻炼列表显示为ngFor)。

当前,我有一个WorkoutListComponent,它使用ngFor(为简化起见,简称)显示列表

<div
  *ngFor="let workout of workouts"
  class="workout__list"
>

  <h2 class="workout__item--title">{{ workout.title }}</h2>
  <h3 class="workout__item--specs-heading">{{ workout.type }}</h3>
  <h3 class="workout__item--specs-heading">{{ workout.duration}}</h3>
  <h3 class="workout__item--specs-heading">{{ workout.phase }}</h3>
</div>

在我的内部ts,我有以下内容:

...
workouts: any;

constructor(private workoutService: WorkoutService) {
  this.workoutService.getWorkouts().subscribe(res => {
    this.workouts = res;
    console.log("List Comp: ", this.workouts);
  });
}

workouts: any由我来workout.service这是保存我的模拟锻炼数据并运行功能以获取和分类锻炼的同一服务。workout.service也正在与观察到的BehaviorSubject,所以我可以订阅它在上面WorkoutListComponent锻炼服务

selectedWorkouts: BehaviorSubject<any>;
  workouts: Workout[] = [
    new Workout( ... dummy text for workouts ... ),
    new Workout( ... dummy text for workouts ... ),
    new Workout( ... dummy text for workouts ... )
  ];
 constructor() {
    this.selectedWorkouts = new BehaviorSubject(this.workouts);
  }

getWorkouts() {
  return this.selectedWorkouts.asObservable();
}

filterWorkouts(phase: any[]) {
  console.log("SERVICE: ", phase);

    // I want the filter to take place here and put the filtered items back into the `this.workouts` array
 }
}

到目前为止,我尝试了无法正常工作的代码,在filterWorkouts()函数中的哪个位置,我进入了阶段和专业,然后进行了过滤,this.workouts并将其存储到中this.workouts由于this.workouts显示在列表项中,因此可以正常工作。不幸的是,它没有按照我想要的方式工作。此代码位于附加的stackblitz中的底部src/app/features/workouts-page/workoutservice/workout.service.ts

我当前接收复选框数据的方式是通过我的WorkoutFilter组件。我将经过检查的属性键值存储在对象数组中,而不是仅使用此stackoverflow中的true or false属性可以在的堆栈闪电找到WorkoutFilter组件src/app/features/workouts-page/workouts/workouts-filter

我要做的就是根据复选框的值找到过滤此列表的最佳方法。

  • 复选框值通过WorkoutFilter组件获得。

  • 我要过滤后要显示的锻炼列表是WorkoutList。

  • 我目前正在为表单使用“应用”按钮。提交后,数据将成为带有字符串的对象,以容纳复选框的值。可以在WorkoutFilter组件中看到

    如果有更好的方法可以做到这一点,甚至可以使用id's,我就会不知所措。

这是StackBlitz代码。我删除了一些组件,例如标题和sidenav,以使查看此问题更加容易。谢谢

豪尔赫·穆萨托

我建议您在使用多个复选框时,使用角度集合中的SelectionModel。尽量不要将带有多个复选框控件的反应式表单用于此类过滤器,SelectionModel使其变得如此简单。

这是堆叠闪电战,希望对您有所帮助。

https://stackblitz.com/edit/github-4rezan-yqxkyv

码:

的HTML:

<h4>Phase</h4>
<div class="checkbox">
    <span *ngFor="let phase of phaseOptions">
      <mat-checkbox
        color="warn"
        type="checkbox"
        (click)="phaseSelection.toggle(phase)"
      >
        {{ phase }}
      </mat-checkbox>
    </span>
</div>

<h4>Specialty</h4>
<div class="checkbox">
    <span *ngFor="let specialty of specialtyOptions">
      <mat-checkbox
        color="warn"
        type="checkbox"
        (click)="specialtySelection.toggle(specialty)"
      >
        {{ specialty }}
      </mat-checkbox>
    </span>
</div>
<button (click)="applyFilter()">Apply</button>

ts:

  specialtySelection = new SelectionModel<string>(true);
  phaseSelection = new SelectionModel<string>(true);

  applyFilter() {
    this.workoutService.filterWorkouts(this.phaseSelection.selected,
         this.specialtySelection.selected);
      }

服务:

filterWorkouts(phases: string[], specialties: string[]) {
  // do Filter with phases and specialties
  if (phases.length === 0 && specialties.length === 0) {
     this.selectedWorkouts.next(workouts);
  } else {
    const byPhase = (workout) => phases.some(phase => workout.phase === phase);
    const bySpecialty = (workout) => specialties.some(specialty => workout.specialty === specialty);
    const workouts = this.workouts.filter(workout => byPhase(workout) && bySpecialty(workout));
    this.selectedWorkouts.next(workouts);
  }
}

希望能有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从entityFramework列表中设置复选框值

来自分类Dev

如何从复选框列表中插入多个值

来自分类Dev

如何按类别,值和已检查复选框对复选框进行排序

来自分类Dev

如何在复选框Angular 8的复选框中以逗号分隔的字符串连接值

来自分类Dev

在Angular 2中使用管道过滤复选框

来自分类Dev

在Angular 2中使用管道过滤复选框

来自分类Dev

如何使用复选框过滤angularJS中的多个值(或操作)

来自分类Dev

如何使用Django中复选框的多个值进行过滤?

来自分类Dev

如何从单选按钮列表和复选框列表中获取选定的值?

来自分类Dev

Angular 2 - 复选框列表 - 如何检查复选框的状态

来自分类Dev

WPF复选框的排序列表

来自分类Dev

复选框列表的奇怪字母排序

来自分类Dev

过滤器栏中的复选框如何工作?

来自分类Dev

如何从数据列表中的复选框向SQL Server中插入文本和值

来自分类Dev

如何知道列表视图的特定行的复选框值

来自分类Dev

根据复选框值过滤div

来自分类Dev

从复选框列表中获取所有值

来自分类Dev

如何在angular.js中同时获取复选框值和单选按钮值

来自分类Dev

Angular和JSON API中的动态复选框列表

来自分类Dev

如何使用asp.net中的javascript获取所选复选框列表项的值

来自分类Dev

如何在选择下拉列表中显示所选复选框的值?

来自分类Dev

Google Apps脚本:如何从复选框列表中的提交函数访问数组值?

来自分类Dev

如何在选择下拉列表中显示所选复选框的值?

来自分类Dev

如何比较 LINQ 中的多个复选框列表值,如 IN 子句 SQL

来自分类Dev

发布表单时如何获取复选框元素中未选中复选框的值?

来自分类Dev

如果选中复选框,如何从复选框中获取属性值?

来自分类Dev

Angular 如何获取多个复选框值?

来自分类Dev

如何使用 Angular 弹出复选框值?

来自分类Dev

下拉列表和复选框过滤器的jQuery排序结果

Related 相关文章

  1. 1

    如何从entityFramework列表中设置复选框值

  2. 2

    如何从复选框列表中插入多个值

  3. 3

    如何按类别,值和已检查复选框对复选框进行排序

  4. 4

    如何在复选框Angular 8的复选框中以逗号分隔的字符串连接值

  5. 5

    在Angular 2中使用管道过滤复选框

  6. 6

    在Angular 2中使用管道过滤复选框

  7. 7

    如何使用复选框过滤angularJS中的多个值(或操作)

  8. 8

    如何使用Django中复选框的多个值进行过滤?

  9. 9

    如何从单选按钮列表和复选框列表中获取选定的值?

  10. 10

    Angular 2 - 复选框列表 - 如何检查复选框的状态

  11. 11

    WPF复选框的排序列表

  12. 12

    复选框列表的奇怪字母排序

  13. 13

    过滤器栏中的复选框如何工作?

  14. 14

    如何从数据列表中的复选框向SQL Server中插入文本和值

  15. 15

    如何知道列表视图的特定行的复选框值

  16. 16

    根据复选框值过滤div

  17. 17

    从复选框列表中获取所有值

  18. 18

    如何在angular.js中同时获取复选框值和单选按钮值

  19. 19

    Angular和JSON API中的动态复选框列表

  20. 20

    如何使用asp.net中的javascript获取所选复选框列表项的值

  21. 21

    如何在选择下拉列表中显示所选复选框的值?

  22. 22

    Google Apps脚本:如何从复选框列表中的提交函数访问数组值?

  23. 23

    如何在选择下拉列表中显示所选复选框的值?

  24. 24

    如何比较 LINQ 中的多个复选框列表值,如 IN 子句 SQL

  25. 25

    发布表单时如何获取复选框元素中未选中复选框的值?

  26. 26

    如果选中复选框,如何从复选框中获取属性值?

  27. 27

    Angular 如何获取多个复选框值?

  28. 28

    如何使用 Angular 弹出复选框值?

  29. 29

    下拉列表和复选框过滤器的jQuery排序结果

热门标签

归档