Angular 6:ERROR TypeError:el.toLowerCase不是函数

use*_*622 4 javascript html5 typescript bootstrap-4 angular

I am creating a simple filter pipe in my app , here is what I have .
Run Code Online (Sandbox Code Playgroud)

过滤组件:

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

    @Pipe({
      name: 'dataFilter'
    })
    export class DataFilterPipe implements PipeTransform {

      transform(value: any[], input: string) {
        if (input) {
            input = input.toLowerCase();
            return value.filter(function (el: any[]) {
                return el.toLowerCase().indexOf(input) > -1;
            });
        }
        return value;
    }

    }
Run Code Online (Sandbox Code Playgroud)

这是componet.html

<div class="card movies-list" id="movies-list">
  <div class="card-header movies-list_header">
    <h1>Content:  <small>Best movies of 2010's</small></h1>
  </div>
  <div class="card-body">
    <div class="row movies-list_filter">
      <div class="col-md-2">Filter By</div>
      <div class="col-md-4">
        <input type='text' [(ngModel)]="listFilter">
      </div>
    </div>
    <div class="row">
      <div class="col-md-6">
        <h1>filterdbY: {{listFilter}}</h1>
      </div>
    </div>
    <table class="table table-striped table-responsive">
      <thead>
        <tr class="movies-list_tbheader">
          <td></td>
          <th>Title</th>
          <th>Realease</th>
          <th>Rating</th>
          <th>Description</th>
        </tr>
      </thead>
      <tbody>
        <tr class="movies-list_data" *ngFor="let movie of movies | dataFilter:listFilter">
          <td>
            <img *ngIf="movie.poster_path" class="thumbnail" src="http://image.tmdb.org/t/p/w500/{{movie.poster_path}}">
          </td>
          <td>{{ movie.title }}</td>
          <td>{{ movie.release_date }}</td>
          <td>{{movie.vote_average}}</td>
          <td>{{movie.overview}}</td>
        </tr>
      </tbody>
    </table>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

在component.ts我已经声明了变量listFilter,如下所示:

export class MoviesComponent implements OnInit {
  listFilter = '';

-----------
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序并尝试搜索一些文本时,我得到以下错误

ERROR TypeError:el.toLowerCase不是函数

我的代码出了什么问题?任何帮助都会被贬低

Deb*_*ahK 9

使用管道过滤数据不被视为"最佳实践".相反,在组件中执行此操作.例如:

// Local filter
performFilter(filterBy: string): IMovie[] {
    if (filterBy) {
        filterBy = filterBy.toLocaleLowerCase();
        return this.movies.filter((movie: IMovie) =>
            movie.title.toLocaleLowerCase().indexOf(filterBy) !== -1);
    } else {
        return this.movies;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里有一篇关于此的详细博客文章:https://blogs.msmvps.com/deborahk/filtering-in-angular/

它详细说明了不应使用管道进行过滤的原因以及执行上述过滤操作的几种不同技术.

BTW ......这段代码看起来很熟悉.:-)这是我的一个OLD Angular v2会谈的代码......在我们收到团队的通知之前,不建议使用这种方式使用管道.

哦......我在另一个答案中查看了您提供的链接作为评论(此后已被删除),代码与您在上面发布的内容不同.以下是您链接中的"工作"代码:

  transform(value: IProduct[], filterBy: string): IProduct[] {
    filterBy = filterBy ? filterBy.toLocaleLowerCase() : null;
    return filterBy ? value.filter((product: IProduct) =>
        product.productName.toLocaleLowerCase().indexOf(filterBy) !== -1) : value;
}
Run Code Online (Sandbox Code Playgroud)

以下是上面的代码:

  transform(value: any[], input: string) {
    if (input) {
        input = input.toLowerCase();
        return value.filter(function (el: any[]) {   // <---- data type!
            return el.toLowerCase().indexOf(input) > -1;
        });
    }
    return value;
}
Run Code Online (Sandbox Code Playgroud)

注意传递给过滤器函数的数据类型是any[].它应该是any.

  • 我更新了我的帖子,向您展示原始代码(来自该链接)和您当前的代码.您可能删除了错误的[]集.这不是一个`值:任何[]`而是那个是'el:any []`的那个是不正确的.尝试从那个删除`[]`,看看你是否还有错误. (2认同)