JavaScript

超轻量级php框架startmvc

详解Angular2组件之间如何通信

更新时间:2020-05-19 17:06 作者:startmvc
组件之间的共享可以有好几种方式父->子input方式import{Component,Input}from'angular2/core';@Component

组件之间的共享可以有好几种方式

父->子 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用处的的可以看 #11

@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生命周期钩子后才能获取,如果对组件生命周期不了解的话,可以参考#56


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)
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。