如何在不使用Ionic2中的@input装饰器的情况下将数据(或引发事件)从父组件传递到子组件

时间:2016-08-23 03:45:12

标签: angular ionic2 angular-components ionic-tabs

我正在使用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>

我希望我的问题很容易理解。

1 个答案:

答案 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);
      })
    }
  } 
}

父组件和子组件都将使用该服务发送搜索栏的值(过滤项目)并获取要在视图中显示的项目列表。