带有过滤方法的角度材料表自己的数据源 [英] Angular Material Table own datasource with filter method

查看:22
本文介绍了带有过滤方法的角度材料表自己的数据源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在此教程的帮助下,我编写了自己的角度材料表的数据源.我从 api 获取数据列表并将其显示在材料表中.

代码我的数据源

export class MyDataSource extends DataSource;{私人用户:Observable;构造函数(私有用户服务:用户服务){极好的();}connect(): Observable{this.users = this.userService.getAll();返回 this.users;}断开连接(){}filterWithCriteria(filterData: any): any {返回 this.users.filter(element => element[filterData.criteria].toLocaleLowerCase().includes(filterData.searchTerm.toLocaleLowerCase())).map(元素 => 元素).订阅(元素 =>控制台日志(元素),错误 =>控制台错误(错误),() =>console.log('流媒体结束'));}}

该 API 提供了一个带有用户对象的 observable.

代码用户

export class User 实现models.User {构造函数(公共名称?:字符串,公共地址?:字符串,公共电子邮件?:字符串,公共电话?:字符串,公众生日?:日期) {}}

目标是在具有条件的用户列表中进行搜索.条件可以是姓名、地址、...

<块引用>

.filter(element => element[filterData.criteria].toLocaleLowerCase().includes(filterData.searchTerm.toLocaleLowerCase()))

这一行给我的错误是 toLocaleLowerCase 没有在 User 中定义,

<块引用>

 console.log(this.users[filterData.criteria]);

给我'未定义'.

感谢您的帮助,

最好的问候

解决方案

@Pierre Mallet 您的过滤器解决方案有效,但我真的不知道该从哪里调用

<块引用>

this.filter$.next({criteria: <theCriteria>, searchTerm: <theTerm>});

由于选择了有棱角的材料,我做了一些改动.

我的实际代码

import { Component, OnInit } from '@angular/core';从 'rxjs/Observable' 导入 { Observable };导入 'rxjs/add/operator/map';导入 'rxjs/add/operator/filter';导入 'rxjs/add/observable/combineLatest';从@angular/cdk/collections"导入{数据源};从'../shared/service/user.service'导入{用户服务};从'../shared/user'导入{用户};import { TransponderFormComponent } from '../transponder-form/transponder-form.component';从'rxjs/BehaviorSubject'导入{BehaviorSubject};@成分({选择器:'app-transponder-list',templateUrl: './transponder-list.component.html',styleUrls: ['./transponder-list.component.scss']})导出类 TransponderListComponent 实现 OnInit {公共用户:用户[];public displayColumns = ['name', 'adress', 'city', 'email', 'telephon', '生日'];公共数据源;公共选择条件:字符串 = '';公共搜索标准 = [{值:'姓名',视图:'姓名'},{值:'城市',视图:'城市'},{值:'地址',视图:'地址'},{ value: 'email', view: 'Email' },{值:'电话',视图:'电话'},{ 值:'生日',视图:'生日' }];构造函数(私有用户服务:用户服务){}ngOnInit() {this.dataSource = new MyDataSource(this.userService);}//从材质选择中获取数据公共 setSearchCriteria() { }公共过滤器(数据:任何){this.dataSource.filter(data.searchTerm, this.selectedColumn);}}导出类 MyDataSource 扩展了 DataSource{私人用户:Observable;private filter$ = new BehaviorSubject({ 条件:null,searchTerm:null });构造函数(私有用户服务:用户服务){极好的();}connect(): Observable{this.users = this.userService.getAll();返回 Observable.combineLatest(this.userService.getAll(), this.filter$).map(latestValues => {const [users, filterData] = latestValues;//改变如果 (!filterData.criteria || !filterData.searchTerm) {回访用户;}返回 users.filter(user => {返回用户[filterData.criteria].toLocaleLowerCase().includes(filterData.searchTerm.toLocaleLowerCase());});});}断开连接(){}过滤器(搜索词:字符串,条件:字符串){if (searchTerm !== '') {//有一个要搜索的 ternif ((标准 !== 未定义) && (标准 !== '')) {console.log('用术语和条件搜索');this.filterWithCriteria(searchTerm, 标准);}}}filterWithCriteria(searchTerm: String, criteria: any): any {返回 this.users.map((用户:用户[]) => {返回 users.filter(user => {返回用户[标准].toLocaleLowerCase().includes(searchTerm.toLocaleLowerCase());});}).订阅(用户 =>控制台日志(用户),错误 =>控制台错误(错误),() =>console.log('流媒体结束'));}}

感谢您的帮助.

最好的问候.

With the help of this tutorial I wrote my own datasource for the angular material table. I get the list of data from an api and display it in a material table.

Code MyDataSource

export class MyDataSource extends DataSource<any> {

  private users: Observable<User[]>;

  constructor(private userService: UserService) {
    super();
  }

  connect(): Observable<User[]> {
    this.users = this.userService.getAll();
    return this.users;
  }

  disconnect() { }

  filterWithCriteria(filterData: any): any {
    return this.users
      .filter(element => element[filterData.criteria].toLocaleLowerCase().includes(filterData.searchTerm.toLocaleLowerCase()))
      .map(element => element)
      .subscribe(
        element => console.log(element),
        err => console.error(err),
        () => console.log('Streaming is over')
      );
   }
}

The api delivers an observable with user objects.

Code User

export class User implements models.User {
  constructor(
    public name?: string,
    public adress?: string,
    public email?: string,
    public telefon?: string,
    public birthday?: Date
  ) {}
}

The objective is to search in the list of the user with a criteria. The criteria can be name, adress, ...

.filter(element => element[filterData.criteria].toLocaleLowerCase().includes(filterData.searchTerm.toLocaleLowerCase()))

This line gives me the error the toLocaleLowerCase is not defined in User and

 console.log(this.users[filterData.criteria]);

gives me 'undefined'.

Thanks for the help,

Best Regards

解决方案

@Pierre Mallet your filter solution works, but I don't really know where to call

this.filter$.next({criteria: <theCriteria>, searchTerm: <theTerm>});

and I did a little change because of the angular material select.

My actual code

import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/filter';
import 'rxjs/add/observable/combineLatest';
import { DataSource } from '@angular/cdk/collections';
import { UserService } from '../shared/service/user.service';
import { User } from '../shared/user';
import { TransponderFormComponent } from '../transponder-form/transponder-form.component';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

@Component({
  selector: 'app-transponder-list',
  templateUrl: './transponder-list.component.html',
  styleUrls: ['./transponder-list.component.scss']
})

export class TransponderListComponent implements OnInit {

  public users: User[];
  public displayedColumns = ['name', 'adress', 'city', 'email', 'telephon', 'birthday'];
  public dataSource;
  public selectedCriteria: String = '';

  public searchCriteria = [
    { value: 'name', view: 'Name' },
    { value: 'city', view: 'City' },
    { value: 'adress', view: 'Adress' },
    { value: 'email', view: 'Email' },
    { value: 'telephon', view: 'Telephon' },
    { value: 'birthday', view: 'Birthday' }
  ];

  constructor(private userService: UserService) { }

  ngOnInit() {
    this.dataSource = new MyDataSource(this.userService);
  }

  // get data from material select
  public setSearchCriteria() { }

  public filter(data: any) {
    this.dataSource.filter(data.searchTerm, this.selectedColumn);
  }
}

export class MyDataSource extends DataSource<any> {

  private users: Observable<User[]>;
  private filter$ = new BehaviorSubject({ criteria: null, searchTerm: null });

  constructor(private userService: UserService) {
    super();
  }

  connect(): Observable<User[]> {
    this.users = this.userService.getAll();
    return Observable.combineLatest(this.userService.getAll(), this.filter$)
      .map(latestValues => {
         const [users, filterData] = latestValues; // change
         if (!filterData.criteria || !filterData.searchTerm) {
           return users;
         }
         return users.filter(user => {
           return user[filterData.criteria].toLocaleLowerCase().includes(filterData.searchTerm.toLocaleLowerCase());
         });
       });
  }

  disconnect() { }

  filter(searchTerm: String, criteria: String) {
    if (searchTerm !== '') {
      // there is a tern to search
      if ((criteria !== undefined) && (criteria !== '')) {
        console.log('Search with term and criteria');
        this.filterWithCriteria(searchTerm, criteria);
      }
    }
  }

  filterWithCriteria(searchTerm: String, criteria: any): any {
    return this.users
      .map((users: User[]) => {
        return users.filter(user => {
          return user[criteria].toLocaleLowerCase().includes(searchTerm.toLocaleLowerCase());
        });
      })
      .subscribe(
        users => console.log(users),
        err => console.error(err),
        () => console.log('Streaming is over')
      );
  }
}

Thanks for your help.

Best regards.

这篇关于带有过滤方法的角度材料表自己的数据源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆