天天看點

Angular 2 元件之間如何通信父->子 input 方式子->父 output 方式子獲得父執行個體父獲得子執行個體service 方式service EventEmitter方式

父->子 input 方式

import {Component,Input} from 'angular2/core';
@Component({
    selector: 'child',
    template: `
        <h2>child {{content}}</h2>
    `
})
class Child {
    @Input() content:string;
}
           
@Component({
    selector: 'App',
    directives: [Child],
    template: `
        <h1>App</h1>
        <child [content]="i"></child>
    `
})
export class App {

    i:number = 0;

    constructor() {
        setInterval(()=> {
            this.i++;
        }, 1000)
    }

}
           

子->父 output 方式

import {Output,EventEmitter,Component} from 'angular2/core';

@Component({
    selector: 'child',
    template: `
        <h2>child</h2>
    `
})
class Child {
    @Output() updateNumberI:EventEmitter<number> = new EventEmitter();
    i:number = 0;

    constructor() {
        setInterval(()=> {
            this.updateNumberI.emit(++this.i);
        }, 1000)
    }
}
           
@Component({
    selector: 'App',
    directives: [Child],
    template: `
        <h1>App {{i}}</h1>
        <child (updateNumberI)="numberIChange($event)"></child>
    `
})
export class App {

    i:number = 0;

    numberIChange(i:number){
        this.i = i;
    }

}

           

子獲得父執行個體

如果不了解

forwardRef

用處的的可以看

這裡

@Host

表示這個

Injector

必須是

host element

在這裡可以了解為

parent

import {Host,Component,forwardRef} from 'angular2/core';

@Component({
    selector: 'child',
    template: `
        <h2>child</h2>
    `
})
class Child {

    constructor(@Host() @Inject(forwardRef(()=> App)) app:App) {
        setInterval(()=> {
            app.i++;
        }, 1000);
    }
}
           
@Component({
    selector: 'App',
    directives: [Child],
    template: `
        <h1>App {{i}}</h1>
        <child></child>
    `
})
export class App {
    i:number = 0;
}
           

父獲得子執行個體

子元素指令在父

constructor

時是擷取不到的,是以必須在元件的

ngAfterViewInit

生命周期鈎子後才能擷取,如果對元件生命周期不了解的話,可以參考

import {ViewChild,Component} from 'angular2/core';

@Component({
    selector: 'child',
    template: `
        <h2>child {{i}}</h2>
    `
})
class Child {
    i:number = 0;
}
           
@Component({
    selector: 'App',
    directives: [Child],
    template: `
        <h1>App {{i}}</h1>
        <child></child>
    `
})
export class App {

    @ViewChild(Child) child:Child;
    ngAfterViewInit() {
        setInterval(()=> {
            this.child.i++;
        }, 1000)
    }

}

           

service 方式

import {Component,Injectable} from 'angular2/core';

@Injectable();
class KittencupService {
    i:number = 0;
}
           
@Component({
    selector: 'child',
    template: `
        <h2>child {{service.i}}</h2>
    `
})
class Child {

    constructor(public service:KittencupService){

    }
}
           
@Component({
    selector: 'App',
    directives: [Child],
    providers: [KittencupService],
    template: `
        <h1>App {{i}}</h1>
        <child></child>
    `
})
export class App {

    constructor(service:KittencupService) {
        setInterval(()=> {
            service.i++;
        }, 1000)
    }

}
           

service EventEmitter方式

import {Component,Injectable,EventEmitter} from 'angular2/core';

@Injectable()
class KittencupService {
    change: EventEmitter<number>;

    constructor(){
        this.change = new EventEmitter();
    }
}
           
@Component({
    selector: 'child',
    template: `
<h2>child {{i}}</h2>
`
})
class Child {

    public i:number = 0;

    constructor(public service:KittencupService){

        service.change.subscribe((value:number)=>{
            this.i = value;
        })
    }
}
           
@Component({
    selector: 'App',
    directives: [Child],
    providers: [KittencupService],
    template: `
<h1>App {{i}}</h1>
<child></child>
`
})
export class App {

    i:number = 0;

    constructor(service:KittencupService) {
        setInterval(()=> {
            service.change.emit(++this.i);
        }, 1000)
    }

}
           

繼續閱讀