【问题标题】:Can't filter data with Angular Reactive Forms无法使用 Angular Reactive Forms 过滤数据
【发布时间】:2021-08-14 01:33:02
【问题描述】:

我大多是 Angular 的新手。我有一个包含帖子列表的页面。我想用搜索框过滤帖子列表,但输入字段没有过滤数据。我不能使用 ngModel,因为我使用的是反应式表单。我认为这与视图中的输入有关。我真的不知道该怎么办了。这是我的代码。

<div class="b-posts">
<form class="b-form" (ngSubmit)="onSubmit(this.postForm.value)" [formGroup]="postForm">
<div class=" b-form__group form-group">
  <span class="b-form__circle"></span>
  <input type="text" name="post" placeholder="Type" class="b-form__input form-control"
    formControlName="text">
</div>
   <div class="b-form__filter form-group">
     <input type="text" formControlName="search">
    </div>
 </form>
  <div *ngFor="let post of filteredPosts">
      {{post.text}}
 </div>
<div class="b-post" *ngFor="let post of posts">
  <div class="b-post__main">
    <div class="b-post__info">
    <span class="b-post__circle"></span>
    <div>
     <p class="b-post__p">{{post.name}}</p>
      <p class="b-post__time">{{post.time}}</p>
    </div>
  </div>
  <div class="b-post__dots"></div>
</div>
<div>
  <p class="b-post__text">{{post.text}}</p>
  </div>
  </div>
 </div>

  The component.ts

   @Component({
    selector: 'app-posts-list',
     templateUrl: './posts-list.component.html',
     styleUrls: [ './posts-list.component.scss' ]
     })
    export class PostsListComponent implements OnInit {
    posts: Post[];
    filteredPosts: Post[];
    private _search: string;

    get search(): string {
    return this._search;
    }

    set search(value: string) {
    this._search = value;
    this.filteredPosts = this.filter(value);
    
    }

   postForm = this.formBuilder.group({
    id: [],
    name: [ 'ImePrezime' ],
    time: [],
    text: [ '' ],
    search: []
});

constructor(
    private formBuilder: FormBuilder,
) {}

ngOnInit(): void {
    this.postListService.getPosts().subscribe((post) => {
        this.posts = post;
    });
    this.filteredPosts = this.posts;
}

filter(data: string) {
    return this.posts.filter((post) => post.text.toLowerCase().indexOf(data.toLowerCase()) !== -1);
}
}

【问题讨论】:

    标签: angular filter angular-reactive-forms


    【解决方案1】:

    您需要使用更改事件来触发搜索输入上的数据过滤器,如下所示:

    <input type="text" formControlName="search" (change)="filterData()">
    
    
    filterData () {
        this.filter(this.postForm.get('search').value);
    }
    
    filter(data: string) {
      if (!data) return;
      return this.posts.filter((post) => post.text && post.text.toLowerCase().indexOf(data.toLowerCase()) !== -1);
    }
    

    如果您想为每次按键触发过滤器,也可以使用 (keyup) 事件

    【讨论】:

    • 我做了和你写的一模一样的东西,但是显示错误。当我在搜索框中输入 ERROR TypeError: Cannot read property 'toLowerCase' of undefined 时显示。
    • 那么问题出在与posts 数据相关的 filter() 函数上。通过安慰来检查即将发生的事情
    • 您还需要检查posts.textdata。它们都应该作为.toLowerCase() 工作的字符串
    • 我做了更改,出现同样的错误
    • filter(data: string) { this.filteredPosts = this.posts.filter((p: Post) => { return p.text.toLowerCase().indexOf(data.toLowerCase()) !== -1; }); }
    【解决方案2】:

    我已经简化了你的代码,因为我看不到服务文件。

    这是一个简化的工作演示。过滤“Enter”命令以避免不必要的表单提交。

    Stackblitz

    如果是你想要的,请告诉我,我会尽力解释。

    目前,您不应该从 .ts 文件中从服务中获取任何数据 - 至少根据您在没有依赖注入的情况下提供的代码。

    【讨论】:

    • 我已经试过你的代码了,还是不行。当我在搜索框中输入时仍然是同样的错误 ERROR TypeError: Cannot read property 'toLowerCase' of undefined
    • 在 Stackblitz 上使用 post.service 中的示例值进行过滤。最有可能的未定义错误与您构建的服务的数据访问有关。你能添加你自己的 post.service 的示例数据 - 帖子数组,看看它是否有效?
    • 我用 db.json 构建了一个工作演示。过滤适用于数据,进行了一些更改。你可以看看这个:stackblitz.com/edit/filtering-example-2?file=src/post-list/…
    • 使用您的代码,过滤工作正常。但是现在有两个问题。第一个是当我过滤时,我只希望过滤帖子出现,而不是全部出现,帖子的完整列表也消失。第二个问题是,当我尝试添加帖子时它不起作用。它仅适用于我删除 filterData 功能(但随后过滤不起作用)
    猜你喜欢
    • 2019-11-26
    • 2019-06-22
    • 2019-08-13
    • 2020-07-24
    • 1970-01-01
    • 2021-02-11
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多