【问题标题】:Filter pipe isn't working correctly angular 7过滤管工作不正常 角度 7
【发布时间】:2019-12-21 19:13:41
【问题描述】:

我遇到的问题是当页面加载并进行 API 调用时,ngfor 循环不会显示所有值,但是当我在搜索框中键入内容以过滤它时,它工作正常,我想要什么它要做的是在页面最初加载时未应用搜索过滤器时返回所有值。

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

@Pipe({
  name: 'filter',
})
export class FilterPipe implements PipeTransform {
  transform(value: string, filterString: string, propName: string): any {
    if (value === null && value.length < 1 || filterString === '') {
      return value;
      /*This value isn't returning when fiter isn't applied on load*/
    }
    const resultArray = [];
    for (const item of value) {
      filterString = filterString.toLowerCase();
      if (item[propName].toLowerCase().indexOf(filterString) >= 0) {
          resultArray.push(item);

    }
  }
    return resultArray;
 }
}
/*Conponent*/
  ngOnInit() {
    this.api.getStopData().subscribe(
      data => {
        this.stations = data;
      }
    );
  }
<div class="container">
<form class="form-inline md-form form-sm active-pink-2 mt-2">
  <input class="form-control form-control-sm mr-3 w-75" name="search" [(ngModel)]="search" type="text"
    placeholder="Search train stations" aria-label="Search">
  <i class="fas fa-search" aria-hidden="true"></i>
</form>
<!-- Card -->
<div *ngFor="let station of stations?.results?.objStation | filter:search:'StationDesc'">
<mdb-card class="m-1">
  <!--Card content-->
  <mdb-card-body>
    <!--Title-->
    <mdb-card-title>
      <h4>{{station.StationDesc}} Train Station</h4>
      <hr/>
    </mdb-card-title>

    <img class="col-6 panel-realtime" src="assets/img/icon_view.png" (click)="getStation(station.StationCode); basicModal.show()"
      mdbWavesEffect/>
    <img class="col-6 panel-remove" src="assets/img/thumbnail_icon_map.png" (click)="getMaps(station.StationDesc); mapsModal.show()" mdbWavesEffect/>

  </mdb-card-body>
</mdb-card>
</div>
</div>

【问题讨论】:

  • Angular 建议不要使用管道进行过滤 (angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe)。对于这种行为,我建议使用 Observables。使用响应式表单,您可以订阅输入的 valueChanges Observable,并使用它来过滤传入的数据。
  • 你的组件是否使用 OnPush 策略?
  • 它所做的只是对我的服务器进行 api 调用

标签: angular typescript


【解决方案1】:

我假设您没有初始化搜索变量,正如您上面没有提到的那样。如果您没有在 component.ts 中初始化 search 变量,则在页面加载时。 搜索变量的值将是 undefined 而不是 ''

解决方案 1:

export class Component implements OnInit{
  search: string;

  constructor() {
   this.search = '';
  }

  ngOnInit() {
    this.api.getStopData().subscribe(
      data => {
        this.stations = data;
      }
    );
  }
}

解决方案 2:

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

@Pipe({
  name: 'filter',
})
export class FilterPipe implements PipeTransform {
  transform(value: string, filterString: string, propName: string): any {
    if (value === null && value.length < 1 || (filterString === '' || filterString === undefined)) {
      return value;
      /*This value isn't returning when fiter isn't applied on load*/
    }
    const resultArray = [];
    for (const item of value) {
      filterString = filterString.toLowerCase();
      if (item[propName].toLowerCase().indexOf(filterString) >= 0) {
          resultArray.push(item);

    }
  }
    return resultArray;
 }
}

【讨论】:

  • 第二种解决方案是有效的,我已将搜索变量初始化为组件中的字符串,但管道中没有未定义,非常感谢您的帮助。
  • 完全没问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多