我正在使用Ionic 2并且有一个用例,其中有一个主页(父组件),在主页内部有一个标签布局,在Ionic 2中,每个标签是一个单独的组件(子组件)。
所以在一个标签中,我显示的是用户列表,在主页中还有一个搜索栏,用户可以通过该搜索栏搜索其他用户。所以现在当用户在搜索栏中输入时,会触发一个在主页(父组件)中定义的函数,但是当此函数被触发时,我需要在用户选项卡(子组件)中引发一个事件,我要在其中过滤用户列表并显示在用户选项卡中。需要帮助来解决这个问题。以下是我的代码
<ion-content>
<ion-tabs>
//UsersTab comopnent class needs to know when getUsers function is triggered from home page
<ion-tab tabTitle="List of Users" [root]="UsersTab"></<ion-tab>
<ion-tab tabTitle="Tab 2" [root]="Tab2"></<ion-tab>
</ion-tabs>
</ion-content>
<ion-footer>
<ion-toolbar>
<ion-title>
// getUsers function will be defined is home page component class
<ion-searchbar (ionInput)="getUsers($event)"></ion-searchbar>
</ion-title>
</ion-toolbar>
</ion-footer>
我希望我的问题很容易理解。
答案 0 :(得分:1)
您可以使用您在this plunker中看到的共享服务来实现这一目标。
该服务将负责存储项目列表并对其进行过滤:
import { Injectable } from "@angular/core";
@Injectable()
export class SharedService {
private userList: Array<string>;
constructor(){
this.initialiceUsers();
}
public initialiceUsers(){
this.userList = [
'Asdf Asdf',
'Zxc Zxc',
'Qwer Qwer',
'Uiop Uiop'
];
}
public setUsers(users: Array<string>): void{
this.userList = users;
}
public getUsers(): Array<string> {
return this.userList;
}
public filterUsers(ev) {
// Reset items back to all of the items
this.initialiceUsers();
// 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.userList = this.userList.filter((item) => {
return (item.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
}
父组件和子组件都将使用该服务发送搜索栏的值(过滤项目)并获取要在视图中显示的项目列表。