【问题标题】:How to search array items in Ionic 3?如何在 Ionic 3 中搜索数组项?
【发布时间】:2019-02-03 13:28:29
【问题描述】:

请我使用模型名称 ResProject 和变量 resProject : Observable ;

这是我的代码:

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Observable } from "rxjs";    

@IonicPage()
@Component({
  selector: 'page-project',
  templateUrl: 'project.html',
})
export class ProjectPage {
  resProject : Observable <ResProject[]> ;
  constructor(public navCtrl: NavController, 
              public navParams: NavParams)

对于 ResProject 的模型,它是这样的:

export interface ResProject {
    key?: string;
    type : string ;
    name : string; 
    nbrUnit : number ; 
    nbrFloor : number ;
}

对于 HTML,这是我的代码:

   <ion-item *ngFor="let rp of resProject  | async" detail-push navPush="ViewProjectPage" [navParams]="{resProject:rp} "  >
    {{rp.name}}
  </ion-item>

请注意,我从 firebase 获取 Resproject 的数据。

如何在我的ion-serchbar 或任何其他解决方案中过滤此 ResProject 列表?

【问题讨论】:

标签: javascript firebase ionic3 observable


【解决方案1】:

您可以使用filter 方法来过滤数组项,如下所示。

home.html

<ion-content padding>
<ion-searchbar (ionInput)="filterItems($event)"></ion-searchbar>
<ion-list>
  <ion-item *ngFor="let item of resProject">
    {{ item.name }}
  </ion-item>
</ion-list>
</ion-content>

HomePage.ts

export class HomePage {

  resProject: any[];

  constructor() {

   this.initializeItems();
  }

  filterItems(event) {

    this.initializeItems();
    const val = event.target.value;
    if (val && val.trim() != '') {
      this.resProject = this.resProject.filter((item: ResProject) => {
        return (item.name.toLowerCase().indexOf(val.toLowerCase()) > -1);
      })
    }
  }

  initializeItems() {
    this.resProject = [
      { name: "Andrew" },
      { name: "Micheal" }, 
      { name: "Bernad" },
      { name: "Charles" }, 
      { name: "David" }];
  }
}

export interface ResProject {
    name : string; 
}

希望这会对您有所帮助。找到工作演示here

【讨论】:

  • 感谢您的回复,我收到此错误:Typescript 错误属性“名称”在类型“ResProject []”上不存在。 src/pages/project/project.ts this.resProject = this.resProject.filter((item) => { return (item.name.toLowerCase().indexOf(val.toLowerCase()) > -1); })
  • 不工作我也需要每个项目的所有价值,比如模型export interface ResProject { key?: string; type : string ; name : string; nbrUnit : number ; nbrFloor : number ; }
  • 我只是展示了一个例子,你需要如何实现它。根据您的要求重新安排代码。
  • 是的,我理解并感谢您的帮助和您的时间,但如果我像您告诉我的那样使用它,我无法从 firebase 获取我的数据并且我收到此错误:Type 'Observable&lt;{ key: string; type: string; name: string; nbrUnit: number; nbrFloor: number; }[]&gt;' is missing the following properties from type 'any[]': length, pop, push, concat, and 22 more.
  • 我对你的问题给出了正确答案。如果它正确,则将其标记为正确答案,如果这是一个新错误,请将其作为一个单独的问题发布到 stackoverflow 中。
【解决方案2】:

在您的情况下,您似乎正在使用 Observables (Rxjs),而这些不是数组,因此您不能将 .filter 等数组方法直接与 Observables 一起使用。您可以使用 Observable 的运算符“filter”实现过滤器:https://www.learnrxjs.io/operators/filtering/filter.html

或者您可以在构造函数中订阅您的服务(返回 Observable),然后使用数组使您的模板工作(因此您不需要模板中的异步管道)。

尝试在您的 TS 中执行以下操作:

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Observable } from "rxjs";
import { ResProject,ComProject,OffiProject } from "../../models/project.model";
import { AddProjectService } from "../../services/addproject.service";

@IonicPage()
@Component({
  selector: 'page-project',
  templateUrl: 'project.html',
})
export class ProjectPage {

  // holders of original unfiltered data:
  resProject : Observable <ResProject[]> ;
  comProject : Observable <ComProject[]>;

  // holders of data for filtered lists, initially set to empty array:
  filteredResProject: any[] = [];
  filteredComProject: any[] = [];

  constructor(public navCtrl: NavController, 
              public navParams: NavParams,
              public projectService : AddProjectService,
              ) 
    { 
      this.initializeItems();
    }

  filterItems(event) {
    this.initializeItems();
    const val = event.target.value;
    if (val && val.trim() != '') {
      this.filteredResProject = this.filteredResProject.filter((item) => {
        return (item.name.toLowerCase().indexOf(val.toLowerCase()) > -1);
      })
    }
  }

  initializeItems() {
    this.resProject = this.projectService.getResProjectList()
    .snapshotChanges()
    .map(
      changes => {
        return changes.map(c => ({
          key : c.payload.key, ...c.payload.val()
        }))
      }

    )
  this.resProject.subscribe( res => {
    this.filteredResProject = res;
  })

  this.comProject = this.projectService.getComProjectList()
  .snapshotChanges()
  .map(
    changes => {
      return changes.map(c => ({
        key : c.payload.key, ...c.payload.val()
      }))
    }

  )
this.comProject.subscribe( res => {
  this.filteredComProject = res;
});
  }

}

在你的模板中你不应该再使用异步管道,因为你只渲染基于数组的数据:

<ion-header>
    <ion-navbar>
      <button ion-button menuToggle>
        <ion-icon name="menu"></ion-icon>
      </button>
    <ion-title>Project List</ion-title>
  </ion-navbar>
  <ion-toolbar>
    <ion-searchbar (ionInput)="filterItems($event)"></ion-searchbar>
  </ion-toolbar>
</ion-header>

<ion-content >
    <ion-list>
        <ion-list-header>
        Project List
        </ion-list-header>
        <ion-badge>Number Of Residential Project :{{ resProject.length }}</ion-badge>
        <ion-item *ngFor="let rp of filteredResProject" detail-push navPush="ViewProjectPage" [navParams]="{resProject:rp} ">
        {{rp.name}}
      </ion-item>
    </ion-list>
    <ion-list>
        <ion-badge color="danger">Number Of Commercial Project :{{ comProject.length }}</ion-badge>
        <ion-item *ngFor="let cp of filteredComProject" detail-push navPush="ViewComProPage" [navParams]="{comProject:cp}">
        {{cp.name}}
      </ion-item>
    </ion-list>
</ion-content>

这不是最好的代码设计,但根据您当前的代码,这应该可以工作。基本思想 - 你想从你的服务中获取完整的真实数据,并且在每次“初始化”时你只修改过滤列表。

【讨论】:

  • 非常感谢它的工作非常感谢您的帮助,我只是在 html 中添加(ionClear)="initializeItems()"
  • 太棒了;) 和不错的一次捕获 re ionClear!
猜你喜欢
  • 1970-01-01
  • 2020-08-27
  • 2017-08-27
  • 2019-03-16
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多