How to make real time search box, in angular 7 cli project

断了今生、忘了曾经 提交于 2019-12-08 11:31:31

问题


I want to make search box in angular 7 cli project. My project back-end was asp.net core web api. i will show array of data set, i want to make search box in angular front-end application. how to make that.

angular 7 cli

Below array of data come from asp.net web api

[
  {
    "productId": 1,
    "productName": "product 1",
    "productPrice": 500,
    "productDescription": "Des 1 enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni.",
    "productCategory": "cat 1",
    "productAvailability": 0
  },
  {
   "productId": 2,
   "productName": "product 2",
   "productPrice": 1000,
   "productDescription": "Des 2 enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni.",
   "productCategory": "cat 2",
   "productAvailability": 0
   },
   {
    "productId": 3,
    "productName": "product 3",
    "productPrice": 2000,
    "productDescription": "Des 3 enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni.",
    "productCategory": "cat 2",
    "productAvailability": 0
   },
   {
    "productId": 4,
    "productName": "PRODUCT 4",
    "productPrice": 3000,
    "productDescription": "Des 4 enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni.",
    "productCategory": "cat 1",
    "productAvailability": 0
    } 
   ]

when i enter letter or number in search input box, only that input text related data will show in front end.


回答1:


BY USING Angular Pipe PROVIDED BY ANGULAR

Html Code

<input type="text" class="form-control" [(ngModel)]="searchText" placeholder="Search item" name="search"
    autocomplete="off">
    <div   *ngFor="let item of data| filterForUser : searchText; let i = index" >
<div> {{item.productId}}-{{item.productName}}</div>
</div>

Filter Component

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
    name: 'filterForUser'
})
export class FilterPipeForUserSearch implements PipeTransform {
    transform(items: any[], searchText: string): any[] {
        if (!items || !searchText) return items;
        searchText = searchText.toLowerCase();
 return items.filter(it => {
            return it.productId==searchText;
        });      
    }

}

To Filter with the all the fields Use following filter Component

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
    name: 'filterForUser'
})
export class FilterPipeForUserSearch implements PipeTransform {
    transform(items: any[], searchText: string): any[] {
        if (!items || !searchText) return items;
        searchText = searchText.toLowerCase();
            return items.filter((data) => this.matchValue(data,searchText)); 
    }
    matchValue(data, value) {
        return Object.keys(data).map((key) => {
           return new RegExp(value, 'gi').test(data[key]);
        }).some(result => result);
      }
}

to show results, when user will type anything in search box only

    if (!items || !searchText) return [];

NOTE: Please declare FilterPipeForUserSearch in app / any other Module




回答2:


Oke lets try to explain. So what you have is your stored data that you show above.

You want to repeat filtering that data.

So first of all you make a copy of it when you collect your data.

Something like

this.historyData = data;

Then when you search you do:

this.data = this.historyData;

Now that part is done, now you want to filter so you do:

let searchedData = [];
for(let i = 0; i < this.data.length; i++) {
  let boolean = false;
  Object.getOwnPropertyNames(this.data[i]).map((key: string) = {
    if(this.data[i][key] === value) { boolean = true; }
  })
  if(boolean) { searchedData.push(this.data[i]); }
}
this.data = searchedData;

And when you value is empty you can do.

if(value === '') { this.data = this.historyData; }
else { //the above



回答3:


Hope I am not too late, but I have an alternative method apart from using Pipes. Basically, this approach requires you to get the keys/properties for the object, and then we iterate through the array to search for the term within each property.

const data = [{
    "productId": 1,
    "productName": "product 1",
    "productPrice": 500,
    "productDescription": "Des 1 enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni.",
    "productCategory": "cat 1",
    "productAvailability": 0
  },
  {
    "productId": 2,
    "productName": "product 2",
    "productPrice": 1000,
    "productDescription": "Des 2 enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni.",
    "productCategory": "cat 2",
    "productAvailability": 0
  },
  {
    "productId": 3,
    "productName": "product 3",
    "productPrice": 2000,
    "productDescription": "Des 3 enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni.",
    "productCategory": "cat 2",
    "productAvailability": 0
  },
  {
    "productId": 4,
    "productName": "PRODUCT 4",
    "productPrice": 3000,
    "productDescription": "Des 4 enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni.",
    "productCategory": "cat 1",
    "productAvailability": 0
  }
];

function search(searchTerm) {
  const val = searchTerm.toLowerCase();
  const keys = Object.keys(data[0]);
  //console.log(keys)
  const searchResults = data.filter(item => {
    // iterate through each row's data by the properties
    for (let i = 0; i < keys.length; i++) {
      if (item[keys[i]].toString().toLowerCase().indexOf(val) !== -1 || !val) {
        return true;
      }
    }
  });
  console.log(searchResults);
  return searchResults;
}
search('Des 2 enim ipsam');


来源:https://stackoverflow.com/questions/55849690/how-to-make-real-time-search-box-in-angular-7-cli-project

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!