【问题标题】:How allow multiple search with ngx-datatable如何允许使用 ngx-datatable 进行多次搜索
【发布时间】:2019-01-10 09:49:11
【问题描述】:

我正在使用这个https://github.com/swimlane/ngx-datatable/blob/master/demo/basic/filter.component.ts 来帮助我在我的表中创建搜索。

我的目标是创建高级搜索:按性别和姓名值过滤

  rows = [
{ name: 'Austin', gender: 'Male', company: 'Swimlane' },
{ name: 'Dany', gender: 'Male', company: 'KFC' },
{ name: 'Molly', gender: 'Female', company: 'Burger King' },
];
columns = [
{ prop: 'name' },
{ name: 'Gender' },
{ name: 'Company' }
];

@ViewChild(DatatableComponent) table: DatatableComponent;

temp=[]

constructor() {
    this.temp = this.rows;
}

updateFilter(event) {
    const val = event.target.value.toLowerCase();

    const temp = this.temp.filter(function (d) {
        return d.name.toLowerCase().indexOf(val) !== -1 || !val;
    });

    this.rows = temp;
 }

 updateFilter1(event) {
  const val = event.target.value.toLowerCase();

  const temp = this.temp.filter(function (d) {
      return d.gender.toLowerCase().indexOf(val) !== -1 || !val;
  });
  this.rows = temp;
}

我只是复制我的搜索创建第二个按性别过滤的功能。但是,两种搜索都是分开工作的(消除了另一个的限制),我不知道如何解决它。

在这里你可以找到我的html

<input
    type='text'
    style='padding:8px;margin:15px auto;width:30%;'
    placeholder='Type to filter the name column...'
    (keyup)='filterByName($event)'
  />
  <input
    type='text'
    style='padding:8px;margin:15px auto;width:30%;'
    placeholder='Type to filter the name column...'
    (keyup)='filterByGender($event)'
  />
  <ngx-datatable
    #table
    class='material'
    [columns]="columns"
    [columnMode]="'force'"
    [headerHeight]="50"
    [footerHeight]="50"
    [rowHeight]="'auto'"
    [limit]="10"
    [rows]='rows'>
  </ngx-datatable>

【问题讨论】:

  • 您想要单独输入还是一个输入同时检查两者?
  • 我更喜欢单独输入以允许我在多个列中创建搜索
  • 好吧,很简单。在调用每个过滤器时,将其要过滤的值保存在顶部的某个变量中。然后,当它们运行时,它们还将过滤另一个最后运行的内容。让我知道这是否是一个不好的解释,我会写一些代码。
  • 这很清楚,但我不知道如何创建这个变量来保持我的第一次搜索。我会试试的,如果你能给我一些代码,那就完美了。
  • 好的,等我几分钟。

标签: angular ngx-datatable


【解决方案1】:
... // other vars you already have
previousNameFilter = ''
previousGenderFilter = ''

filterByName(event) {
  const filter = event.target.value
  this.previousNameFilter = filter
  this.temp = this.filterRows(filter, this.previousGenderFilter)
}

filterByGender(event) {
  const filter = event.target.value
  this.previousGenderFilter = filter
  this.temp = this.filterRows(this.previousNameFilter, filter)
}


filterRows(nameFilter, genderFilter): any[] {
  nameFilter = nameFilter.toLowerCase()
  genderFilter = genderFilter.toLowerCase()

  return this.rows.filter(row => {
    const isPartialNameMatch = row.name.toLowerCase().indexOf(nameFilter) !== -1 || !nameFilter
    const isPartialGenderMatch = row.gender.toLowerCase().indexOf(genderFilter) !== -1 || !genderFilter
    return isPartialNameMatch && isPartialGenderMatch
  });
}

Stackblitz used for testing

【讨论】:

  • 哎呀。忘了在这两个函数中说“常量过滤器”。很有可能有错别字,因为我实际上并没有运行此代码。不确定您对 this.previousNameFilter 和 this.previousGenderFilter 的评论意味着什么(也不确定您是否故意拼错)
  • 我认为我们必须在函数 filterByGender 中为previousNameFilter 添加前缀this.previousNameFilter。 filterByName 的方法相同。
  • 哦,你是对的。不理解你是我的错
  • 是我,非常感谢您的帮助。不幸的是,这两个搜索现在都没有做任何事情。 :(
  • 我还添加了一个代码示例(它没有文字表,但它会记录过滤器的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2022-01-14
  • 2018-10-16
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多