带过滤器的搜索栏和来自 JSON 数据的 Ionic 2
Searchbar with filter and from JSON data with Ionic 2
我是 Typescript 和 Ionic 2 的新手,我正在尝试使用 Ionic 2 搜索栏通过 json 响应进行过滤。
这是我的代码:
import {Component} from '@angular/core';
import {NavController} from 'ionic-angular';
import {Http} from '@angular/http';
import 'rxjs/add/operator/map';
@Component({
templateUrl: 'build/pages/home/home.html'
})
export class HomePage {
posts: any;
private searchQuery: string = '';
private items: string[];
constructor(private http: Http) {
this.initializeItems();
this.http.get('https://domain.co/open.jsonp').map(res => res.json()).subscribe(data => {
this.posts = data;
console.log(this.posts);
});
}
initializeItems() {
this.items = this.posts;
}
getItems(ev: any) {
// Reset items back to all of the items
this.initializeItems();
// set val to the value of the searchbar
let val = ev.target.value;
// if the value is an empty string don't filter the items
if (val && val.trim() != '') {
this.items = this.items.filter((item) => {
return (item.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
}
和标记:
<ion-header>
<ion-searchbar (ionInput)="getItems($event)" [debounce]="500" placeholder="Suchen..."></ion-searchbar>
</ion-header>
<ion-content>
<ion-list>
<ion-item *ngFor="let post of posts">
<h1>{{post.storeName}}</h1>
</ion-item>
</ion-list>
</ion-content>
我搜索的时候出现这个错误:
item.toLowerCase is not a function
JSON 数据如下所示:
[
{
storeName: "Avec Hauptbahnhof",
addressLink: "",
phone: "0326223902",
image: "",
description: "",
link: "",
openingHours: [
"05.30 - 22:00",
"05.30 - 22:00",
"05.30 - 22:00",
"05.30 - 22:00",
"05.30 - 22:00",
"06.30 - 22:00",
"7.00 - 22.00"
]
},
{
storeName: "Manor",
addressLink: "",
phone: "0326258699",
image: "",
customer: "",
description: "",
link: "",
openingHours: [
"09.00 - 18.30",
"09.00 - 18.30",
"09.00 - 18.30",
"09.00 - 21:00",
"09.00 - 18.30",
"08.00 - 17.00",
"Geschlossen"
]
}
]
你得到那个错误是因为每个 item 不是一个字符串,而是一个对象,所以不要做
item.toLowerCase().indexOf(val.toLowerCase()) > -1
你应该做
item.storeName.toLowerCase().indexOf(val.toLowerCase()) > -1
另请注意,在您看来,您正在使用 posts 数组
*ngFor="let post of posts"
但是您应该改用 items 数组,因为这是要被过滤的数组
<ion-list>
<ion-item *ngFor="let item of items">
<h1>{{item.storeName}}</h1>
</ion-item>
</ion-list>
除此之外,我会做一些不同的事情,只是为了确保用户能够在数据可用时仅使用页面(因为你'正在使用 http 请求来获取它)。为此,我将添加一个加载警报,并在 http 请求完成后立即将其删除。从 Ionic2-beta.11 开始,您可以这样做:
import { Component } from '@angular/core';
import { NavController, LoadingController } from 'ionic-angular';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
@Component({
templateUrl: 'build/pages/home/home.html'
})
export class HomePage {
private posts: any; // <- I've added the private keyword
private searchQuery: string = '';
private items: any; // <- items property is now of the same type as posts
constructor(private http: Http, private loadingCtrl: LoadingController) {
// this.initializeItems(); <- you don't need this anymore
// Show the loading message
let loadingPopup = this.loadingCtrl.create({
content: 'Loading posts...'
});
this.http.get('https://domain.co/open.jsonp').map(res => res.json()).subscribe(data => {
this.posts = data;
this.initializeItems();
// Hide the loading message
loadingPopup.dismiss();
});
}
initializeItems() {
this.items = this.posts;
}
getItems(ev: any) {
// Reset items back to all of the items
this.initializeItems();
// set val to the value of the searchbar
let val = ev.target.value;
// if the value is an empty string don't filter the items
if (val && val.trim() != '') {
this.items = this.items.filter((item) => {
return (item.storeName.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
}
我在 angular 2 中使用 ionic 工作时遇到的同样问题。
在我们的项目中,我们有一种方法可以使用 *ngFor 获取所有产品列表并显示项目。
每当我们使用 ionic 搜索栏进行搜索时,输入的搜索文本将使用 "event.target.value" 获取。我们必须检查搜索文本是否在项目中匹配。
代码是,
getAllProdcuts(isFrom, searchText){
this.toDoService.getAllProdcuts().then((res) => {
this.items = res;
if(isFrom == 'search') {
this.items = this.items.filter((item) => {
return (item.toLowerCase().indexOf(searchText.toLowerCase()) > -1);
})
}
}, (err) => {
});
}
getItems(ev: any) {
// set val to the value of the searchbar
let val = ev.target.value;
// if the value is an empty string don't filter the items
if (val && val.trim() != '') {
this.getAllProdcuts("search", val);
}
}
在这里,我们可以从方法中获取过滤的项目。
谢谢!
我是 Typescript 和 Ionic 2 的新手,我正在尝试使用 Ionic 2 搜索栏通过 json 响应进行过滤。
这是我的代码:
import {Component} from '@angular/core';
import {NavController} from 'ionic-angular';
import {Http} from '@angular/http';
import 'rxjs/add/operator/map';
@Component({
templateUrl: 'build/pages/home/home.html'
})
export class HomePage {
posts: any;
private searchQuery: string = '';
private items: string[];
constructor(private http: Http) {
this.initializeItems();
this.http.get('https://domain.co/open.jsonp').map(res => res.json()).subscribe(data => {
this.posts = data;
console.log(this.posts);
});
}
initializeItems() {
this.items = this.posts;
}
getItems(ev: any) {
// Reset items back to all of the items
this.initializeItems();
// set val to the value of the searchbar
let val = ev.target.value;
// if the value is an empty string don't filter the items
if (val && val.trim() != '') {
this.items = this.items.filter((item) => {
return (item.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
}
和标记:
<ion-header>
<ion-searchbar (ionInput)="getItems($event)" [debounce]="500" placeholder="Suchen..."></ion-searchbar>
</ion-header>
<ion-content>
<ion-list>
<ion-item *ngFor="let post of posts">
<h1>{{post.storeName}}</h1>
</ion-item>
</ion-list>
</ion-content>
我搜索的时候出现这个错误:
item.toLowerCase is not a function
JSON 数据如下所示:
[
{
storeName: "Avec Hauptbahnhof",
addressLink: "",
phone: "0326223902",
image: "",
description: "",
link: "",
openingHours: [
"05.30 - 22:00",
"05.30 - 22:00",
"05.30 - 22:00",
"05.30 - 22:00",
"05.30 - 22:00",
"06.30 - 22:00",
"7.00 - 22.00"
]
},
{
storeName: "Manor",
addressLink: "",
phone: "0326258699",
image: "",
customer: "",
description: "",
link: "",
openingHours: [
"09.00 - 18.30",
"09.00 - 18.30",
"09.00 - 18.30",
"09.00 - 21:00",
"09.00 - 18.30",
"08.00 - 17.00",
"Geschlossen"
]
}
]
你得到那个错误是因为每个 item 不是一个字符串,而是一个对象,所以不要做
item.toLowerCase().indexOf(val.toLowerCase()) > -1
你应该做
item.storeName.toLowerCase().indexOf(val.toLowerCase()) > -1
另请注意,在您看来,您正在使用 posts 数组
*ngFor="let post of posts"
但是您应该改用 items 数组,因为这是要被过滤的数组
<ion-list>
<ion-item *ngFor="let item of items">
<h1>{{item.storeName}}</h1>
</ion-item>
</ion-list>
除此之外,我会做一些不同的事情,只是为了确保用户能够在数据可用时仅使用页面(因为你'正在使用 http 请求来获取它)。为此,我将添加一个加载警报,并在 http 请求完成后立即将其删除。从 Ionic2-beta.11 开始,您可以这样做:
import { Component } from '@angular/core';
import { NavController, LoadingController } from 'ionic-angular';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
@Component({
templateUrl: 'build/pages/home/home.html'
})
export class HomePage {
private posts: any; // <- I've added the private keyword
private searchQuery: string = '';
private items: any; // <- items property is now of the same type as posts
constructor(private http: Http, private loadingCtrl: LoadingController) {
// this.initializeItems(); <- you don't need this anymore
// Show the loading message
let loadingPopup = this.loadingCtrl.create({
content: 'Loading posts...'
});
this.http.get('https://domain.co/open.jsonp').map(res => res.json()).subscribe(data => {
this.posts = data;
this.initializeItems();
// Hide the loading message
loadingPopup.dismiss();
});
}
initializeItems() {
this.items = this.posts;
}
getItems(ev: any) {
// Reset items back to all of the items
this.initializeItems();
// set val to the value of the searchbar
let val = ev.target.value;
// if the value is an empty string don't filter the items
if (val && val.trim() != '') {
this.items = this.items.filter((item) => {
return (item.storeName.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
}
我在 angular 2 中使用 ionic 工作时遇到的同样问题。
在我们的项目中,我们有一种方法可以使用 *ngFor 获取所有产品列表并显示项目。
每当我们使用 ionic 搜索栏进行搜索时,输入的搜索文本将使用 "event.target.value" 获取。我们必须检查搜索文本是否在项目中匹配。
代码是,
getAllProdcuts(isFrom, searchText){
this.toDoService.getAllProdcuts().then((res) => {
this.items = res;
if(isFrom == 'search') {
this.items = this.items.filter((item) => {
return (item.toLowerCase().indexOf(searchText.toLowerCase()) > -1);
})
}
}, (err) => {
});
}
getItems(ev: any) {
// set val to the value of the searchbar
let val = ev.target.value;
// if the value is an empty string don't filter the items
if (val && val.trim() != '') {
this.getAllProdcuts("search", val);
}
}
在这里,我们可以从方法中获取过滤的项目。
谢谢!