【问题标题】:How to create pipe to filter list in Angular2如何在Angular2中创建管道过滤列表
【发布时间】:2017-06-12 00:38:43
【问题描述】:

我在创建管道以从输入中过滤列表时遇到问题。

我想要的是这样的:http://www.w3schools.com/howto/howto_js_filter_lists.asp

有没有人可以帮助我为此创建管道?

更新,我用一个提议更改了代码,但它仍然无法使用我的部分代码。

我的代码中的一些部分:

component.html:

<input id="desc" type="text" placeholder="Alarm name" [(ngModel)]="desc">
  
 <ul>
    <li *ngFor="let name of names" [style.display]="(name | search : desc) ? 'block' : 'none'">
      {{ name }}
    </li>
  </ul>

<div class="alarm-list-item" *ngFor="let alarm of alarmsList" [style.display]="(alarm.Description | search : desc) ? 'block' : 'none'">
     {{alarm.Description }}
  </div>

alarmList 是一个数组:

enter image description here

search.pipe.ts 我还必须更改管道代码,因为“包含”不起作用,我将类型更改为任何:

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

@Pipe({
  name: 'search'
})
export class SearchPipe implements PipeTransform {
    transform(list: any, searchText: any): any {
        for(let i=0; i<list.length; i++){
          if(list[i].includes(searchText)){
            return true;
          }
        }
        return false;
    }
}

【问题讨论】:

    标签: javascript angular angular2-pipe


    【解决方案1】:

    这样的事情可能会有所帮助

    import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({
       name: 'search',
       pure: true
    })
    
    export class SearchPipe implements PipeTransform {
       transform(value: any, args:string=''): any {
         console.log(value);
         if(!value) return value;
         else {
            if(value.toLowerCase().indexOf(args.toLowerCase())!= -1) {
               return value;
            }
         }
       }
    }
    

    在你的组件中

    @Component({
       selector: 'my-app',
       template: `
          <input type="text" [(ngModel)]="filterValue">
          <ul>
            <li *ngFor="let name of names">{{name | search:filterValue}}</li>
          </ul>`,
       })
    
    export class AppComponent  { 
       names:Array<string> = ['Agnes','Adele','Binny','Bob'];
       constructor(){
    
       }
    }
    

    【讨论】:

    • 我想你交换了
        和
    • 你测试过这段代码吗?是否可以将 ngFor 放在
        上。
      • 你想要 *ngFor,不是吗?
    • 你是对的..最后一个代码正在工作,因为 ngFor 在 li. 编辑后没有检查,但这不会工作......
    【解决方案2】:

    我相信你不应该用 Pipe 这样做。

    您想要的是对您的 itemssource 'alarmlist' 执行 angular 2 不允许的管道操作。

    你可以做的是这样的事情,我不建议这样做,因为它是丑陋的代码:

    https://plnkr.co/edit/3e6cFSBFIf0uYYIgKNZ8?p=preview

    我的建议是创建另一个属性:filteredAlarmList,您可以在 &lt;input&gt; 的 (change) 事件或您的 desc 属性的设置器中编辑它,然后像 *ngFor="let alarm of filteredAlarmList" 一样重写您的 ngFor

    如果您多次需要这种过滤,您可以将所有这些提取到单独的组件中。例如:FilterListComponent,它将接受 2 个输入:searchText 和 List(在您的情况下为 AlarmList)

    【讨论】:

    • 能否请您给我看一下您的第二个提议的代码?来自 plnkr.co 的第一个不工作。
    • 它没有完全按照我的意愿工作 - 我更新了主要问题。
    • 它正在工作:) 谢谢!我用过这个: import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'search' }) 导出类 SearchPipe 实现 PipeTransform { transform(val: any, searchText: any): any { if (val.toLowerCase().includes(searchText.toLowerCase())) return true;返回假; } }
    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 2020-07-26
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多