1. 程式人生 > >Angular 2/Ionic 2 @input和@output理解

Angular 2/Ionic 2 @input和@output理解

先說說如何區分子元件、父元件。比如說我有一個元件A,他的選擇器是cmpA,然後B元件裡的html檔案裡用到了cmpA,那麼A元件就是子元件,B元件就是父元件。

做個比方,然後奉上程式碼 比如:

<talk-cmp [talk]="someExp" (rate)="eventHandler($event.rating)">

input, [talk]="someExp" 這個標籤可以理解為一個專門的監聽器,監聽父元件傳遞過來的someExp引數,並存入自身元件的talk變數;好像是開了個後門,允許且只允許父元件的someExp進入,一旦進入立刻抓進一個叫talk的牢房,然後子元件中就可以通過@Input來定義這個變數talk然後使用它。

output ,(click)="eventHandler($event.rating) 這個意思是, 當子元件的click事件被觸發,就執行父元件的eventHandler函式,並把子元件的引數$event.rating傳遞給父元件的eventHandler函式;就好像,當小孩子一哭(執行click事件),他的母親立刻把他抱在懷裡(執行母親的eventHandler),同時母親獲得了小孩子的一些引數($event.rating),上面的[talk]就相當於母親給孩子的禮物,但是孩子只能通過@input()去拿。

我的理解就是: input是子元件接受父元件傳進來的引數,output是子元件通過觸發事件向父元件傳資料

1. @input()

父元件 father.component.ts 提供資料

import {Component} from "@angular/core";
@Component({
    selector: "my-father",
    templateUrl: "father.html"
})
export class FatherComponent {
    data: Array<Object>;
    constructor() {
        this.data = [
            {
                "id": 1,
                "name": "html"
            },
            {
                "id": 2,
                "name": "css"
            },
            {
                "id": 3,
                "name": "angular"
            },
            {
                "id": 4,
                "name": "ionic"
            },
            {
                "id": 5,
                "name": "node"
            }
        ]
    }
}

模板檔案 father.html

<h1>父元件</h1>
// 包含子元件, 並使用屬性傳遞資料過去
<my-child [info]="data"></my-child>

子元件 child.component.ts 獲取資料

import {Component, Input} from "@angular/core";
@Component({
    selector: "my-child",
    templateUrl: "child.html"
})
export class ChildComponent {   
    // 使用@Input獲取傳遞過來的資料
    @Input()
    info: Array<Object>;
    constructor() {
    
    }
}

子元件 child.html模板檔案

<ul>
    <li *ngFor="let item of info">
        {{item.name}}
    </li>
</ul>

2、@Output()

子元件three-link.component.ts

1. 引入

import {Component, OnInit, Output, EventEmitter} from "@angular/core";

2. 定義輸出變數

export class ThreeLinkComponent {
    province: string;
    // 輸出一下引數
    @Output() provinceOut = new EventEmitter();   
    constructor() {
        this.province = "陝西";
    } 
}

3. 事件出發,發射變數給父元件

provinceChange() {
    // 選擇省份的時候發射省份給父元件
    this.provinceOut.emit(this.province);
}

父元件模板

<!--三級聯動元件-->
<three-link (provinceOut)="recPro($event)"></three-link>

父元件

// 函式接受子函式傳遞過來的變數, 子函式中emit的時候觸發這個函式。
recPro(event) {
   this.province = event;
}

3.另外一個父元件中訪問子元件中的方法

子元件CircleComponent中定義了 getColorRedFun(i)方法,父元件中想呼叫這個方法。 1、html中新增標記 #circleComponent 2、使用@ViewChild訪問子元件 3、ngAfterViewInit()以後才可以訪問到獲取的子元件 4、就可以通過 this.circleComponent訪問子元件中的屬性和方法了。

html
<page-circle #circleComponent></page-circle>

ts
export class HomePage {
  @ViewChild("circleComponent")
  circleComponent: CircleComponent;
  ngAfterViewInit() {
    console.log(this.circleComponent);
    this.circleComponent.getColorRedFun(4);
  }
}