代码之家  ›  专栏  ›  技术社区  ›  T. Evans

角度4过滤器搜索自定义管道

  •  6
  • T. Evans  · 技术社区  · 7 年前

    因此,我试图构建一个自定义管道,在ngFor循环中对多个值进行搜索筛选。我花了好几个小时寻找一个好的工作示例,其中大多数基于以前的版本,似乎不起作用。所以我在构建管道,并使用控制台来提供值。然而,我似乎无法显示输入文本。

    以下是我之前寻找工作示例的地方:

    Angular 4 Pipe Filter

    http://jilles.me/ng-filter-in-angular2-pipes/

    https://mytechnetknowhows.wordpress.com/2017/02/18/angular-2-pipes-passing-multiple-filters-to-pipes/

    https://plnkr.co/edit/vRvnNUULmBpkbLUYk4uw?p=preview

    https://www.youtube.com/results?search_query=filter+search+angular+2

    https://www.youtube.com/watch?v=UgMhQpkjCFg

    以下是我目前拥有的代码:

    组成部分html

    <input type="text" class="form-control" placeholder="Search" ngModel="query" id="listSearch" #LockFilter>
    
          <div class="panel panel-default col-xs-12 col-sm-11" *ngFor="let lock of locked | LockFilter: query">
            <input type="checkbox" ngModel="lock.checked" (change)="openModal($event, lock)" class="check" id="{{lock.ID}}">
            <label for="{{lock.ID}}" class="check-label"></label>
            <h3 class="card-text name" ngModel="lock.name">{{lock.User}}</h3>
            <h3 class="card-text auth" ngModel="lock.auth">{{lock.AuthID}}</h3>
            <h3 class="card-text form" ngModel="lock.form">{{lock.FormName}}</h3>
            <h3 class="card-text win" ngModel="lock.win">{{lock.WinHandle}}</h3>
          </div>
    

    管输电系统

    import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({
      name: 'LockFilter'
    })
    
    export class LockFilterPipe implements PipeTransform {
      transform(locked: any, query: string): any {
        console.log(locked); //this shows in the console
        console.log(query); //this does not show anything in the console when typing
        if(!query) {
          return locked;
        }
        return locked.filter((lock) => {
          return lock.User.toLowerCase().match(query.toLowerCase());
        });
      }
    }
    

    我已将管道导入模块。

    我还是有点新的角度4,并试图找出如何使这项工作。无论如何,谢谢你的帮助!

    我想我需要更具体一些。我已经在JS中构建了一个过滤器搜索,它不会过滤所有的选项,这就是我正在尝试做的。不仅仅是过滤用户名。我正在过滤所有4条数据。我选择了一个管道,因为这是AngularJS最初在AngularJS中使用的管道。我只是想从本质上重建AngularJS中的过滤管,他们为了性能而移除了过滤管。我发现的所有选项都不起作用,或者是以前版本的Angular。

    如果你需要我的代码中的任何其他信息,请告诉我。

    6 回复  |  直到 7 年前
        1
  •  19
  •   Chintan Kotadiya    7 年前

    我必须在本地实现搜索功能,这里更新了您的代码。请这样做。

    这是我必须更新的代码。

    目录结构

    app/
       _pipe/
            search/
              search.pipe.ts
              search.pipe.spec.ts
    app/ 
       app.component.css
       app.component.html
       app.component.ts
       app.module.ts
       app.component.spec.ts
    

    用于创建管道的命令运行

    ng g pipe search
    

    组成部分html

    <input type="text" class="form-control" placeholder="Search" [(ngModel)]="query" id="listSearch">
        <div class="panel panel-default col-xs-12 col-sm-11" *ngFor="let lock of locked | LockFilter: query">
        <input type="checkbox" (change)="openModal($event, lock)" class="check" id="{{lock.ID}}">
        <label [for]="lock.ID" class="check-label"></label>
        <h3 class="card-text name">{{lock.User}}</h3>
        <h3 class="card-text auth">{{lock.AuthID}}</h3>
        <h3 class="card-text form">{{lock.FormName}}</h3>
        <h3 class="card-text win">{{lock.WinHandle}}</h3>
    </div>
    

    注意:在这个文件中,我必须使用虚拟记录来实现和测试。

    import { Component, OnInit } from '@angular/core';
    import { FormsModule }   from '@angular/forms';
    
    @Component({
        selector: 'app-root',
        templateUrl: './app.component.html',
        styleUrls: ['./app.component.css']
    })
        export class AppComponent implements OnInit{
        public search:any = '';
        locked: any[] = [];
    
        constructor(){}
    
        ngOnInit(){
            this.locked = [
                {ID: 1, User: 'Agustin', AuthID: '68114', FormName: 'Fellman', WinHandle: 'Oak Way'},
                {ID: 2, User: 'Alden', AuthID: '98101', FormName: 'Raccoon Run', WinHandle: 'Newsome'},
                {ID: 3, User: 'Ramon', AuthID: '28586', FormName: 'Yorkshire Circle', WinHandle: 'Dennis'},
                {ID: 4, User: 'Elbert', AuthID: '91775', FormName: 'Lee', WinHandle: 'Middleville Road'},
            ]
        }
    }
    

    单元输电系统

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    import { FormsModule }   from '@angular/forms';
    import { AppComponent } from './app.component';
    import { SearchPipe } from './_pipe/search/search.pipe';
    
    
    @NgModule({
      declarations: [
        AppComponent,
        SearchPipe
      ],
      imports: [
        BrowserModule,
        FormsModule
      ],
      providers: [],
      bootstrap: [AppComponent]
    })
    export class AppModule { }
    

    import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({
        name: 'LockFilter'
    })
    
    export class SearchPipe implements PipeTransform {
        transform(value: any, args?: any): any {
    
            if(!value)return null;
            if(!args)return value;
    
            args = args.toLowerCase();
    
            return value.filter(function(item){
                return JSON.stringify(item).toLowerCase().includes(args);
            });
        }
    }
    

    我希望您正在获得管道功能,这将对您有所帮助。

        2
  •  3
  •   Virendra Pandey    6 年前

    角度2的简单过滤管+

    import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({
      name: 'filter'
    })
    export class filterPipe implements PipeTransform {
    
      transform(items: any[], field:string, value: string): any[] {
    
        if(!items) return [];
        if(!value) return items;
    
    
        return items.filter( str => {
              return str[field].toLowerCase().includes(value.toLowerCase());
            });
       }
    }
    

    这是HTML

    <input type="text" class="form-control" placeholder="Search" id="listSearch" #search>
        <div class="panel panel-default col-xs-12 col-sm-11" *ngFor="let lock of locked | filter:'propName': search.value>
        <input type="checkbox" (change)="openModal($event, lock)" class="check" id="{{lock.ID}}">
        <label [for]="lock.ID" class="check-label"></label>
        <h3 class="card-text name">{{lock.User}}</h3>
        <h3 class="card-text auth">{{lock.AuthID}}</h3>
        <h3 class="card-text form">{{lock.FormName}}</h3>
        <h3 class="card-text win">{{lock.WinHandle}}</h3>
    </div>
    

    在HTML中 属性名称 属性名称 使用任意对象属性键。

        3
  •  1
  •   Madhavi Gandu    5 年前

    按照以下代码使用自定义筛选器筛选特定列,而不是表中的所有列

    文件名。组成部分html

    <table class="table table-striped">
      <thead>
        <tr>
          <th scope="col">product name </th>
          <th scope="col">product price</th>
       </tr>
      </thead>
    
      <tbody>
        <tr *ngFor="let respObj of data | filter:searchText">
          <td>{{respObj.product_name}}</td>
          <td>{{respObj.product_price}}</td>
        </tr>
     </tbody>
    </table>
    

    文件名。组成部分输电系统

    import { Component, OnInit } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    
    
    @Component({
      selector: 'app-productlist',
      templateUrl: './productlist.component.html',
      styleUrls: ['./productlist.component.css']
    })
    
    export class ProductlistComponent implements OnInit  {
    
      searchText: string;
    
      constructor(private http: HttpClient) { }
      data: any;
      ngOnInit() {
        this.http.get(url)
          .subscribe(
            resp => {
             this.data = resp;
    
            }
          )
      }
    }
    

    文件名。管输电系统
    管道变换 ,这样我们就可以用 方法

    import { Pipe, PipeTransform } from '@angular/core';
    @Pipe({
      name: 'filter'
    })
    export class PipeList implements PipeTransform {
      transform(value: any, args?: any): any {
        if(!args)
         return value;
        return value.filter(
          item => item.product_name.toLowerCase().indexOf(args.toLowerCase()) > -1
       );
      }
    }
    
        4
  •  0
  •   Prashant M Bhavsar    6 年前

    下面是创建自定义管道的简单说明。。可用管道不支持它。 我找到了这个解决方案 here ..解释得很好

    创建管道文件高级过滤器。管

    import {Pipe, PipeTransform} from '@angular/core';
    
    @Pipe({
      name: 'advancedFilters'
    })
    
    export class AdvancedFilterPipe implements PipeTransform {
    
      transform(array: any[], ...args): any {
        if (array == null) {
          return null;
        }
    
        return array.filter(function(obj) {
          if (args[1]) {
            return obj.status === args[0];
          }
          return array;
        });
    
      }
    
    }
    

    在这里,数组–将是传递给自定义管道的数据数组 对象将是数据的对象,通过使用该对象,您可以添加条件来过滤数据

    我们增加了条件 obj.status === args[0] 因此,数据将根据传入的状态进行过滤。html文件

    现在,在模块中导入并声明自定义管道。组件的ts文件:

    import {AdvancedFilterPipe} from './basic-filter.pipe';
    
    //Declare pipe
    
    @NgModule({
    
        imports: [DataTableModule, HttpModule, CommonModule, FormsModule, ChartModule, RouterModule],
    
        declarations: [ DashboardComponent, AdvancedFilterPipe],
    
        exports: [ DashboardComponent ],
    
        providers: [{provide: HighchartsStatic}]
    
    })
    

    在中使用创建的自定义角度管道。html文件

    <table class="table table-bordered" [mfData]="data | advancedFilters: status" #mf="mfDataTable" [mfRowsOnPage]="rowsOnPage" [(mfSortBy)]="sortBy" [(mfSortOrder)]="sortOrder">
    
                    <thead>
                           <tr>
                                 <th class="sortable-column" width="12%">
                                     <mfDefaultSorter by="inquiry_originator">Origin</mfDefaultSorter>
                                 </th>
                            </tr>
                    </thead>
    
                    <tbody class="dashboard-grid">
    
                                    <ng-container *ngFor="let item of mf.data; let counter = index;">
    
                                                    <tr class="data-row {{ item.status }} grid-panel-class-{{ counter }}">                                      
    
                                                                    <td class="align-center">{{ item.trn_date }}</td>
    
                                                                    <td>{{ item.trn_ref }}</td>
    
                                                    </tr>
    
                    </tbody>
    
    </table>
    
    
    //If you are using *ngFor and want to use custom angular pipe then below is code
    
    <li *ngFor="let num of (numbers | advancedFilters: status">
      {{ num | ordinal }}
    </li>
    
        5
  •  0
  •   Sen    6 年前

    transform(value:IBook[], keyword:string) {       
            if(!keyword)
            return value;
            let filteredValues:any=[];      
            for(let i=0;i<value.length;i++){
                if(value[i].name.toLowerCase().includes(keyword.toLowerCase())){
                    filteredValues.push(value[i]);
                }
            }
            return filteredValues;
        }
    <h2>Available Books</h2>
    <input type="text" [(ngModel)]="bookName"/>
    <ul class="books">
      <li *ngFor="let book of books | search:bookName"
        [class.selected]="book === selectedBook"
        (click)="onSelect(book)">
        <span class="badge">{{book.name}}</span>
      </li>
    </ul>
        6
  •  -2
  •   Rahul Gupta    7 年前

    您可以在输入框的(输入)事件上使用给定的函数

    filterNames(event)
    {
     this.names_list = this.names_list.filter(function(tag) {
     return tag.name.toLowerCase().indexOf(event.target.value.toLowerCase()) >= 0;
     });
    }
    

    希望有帮助。。