详解Angular2组件之间如何通信
组件之间的共享可以有好几种方式
父->子input方式
import{Component,Input}from'angular2/core';
@Component({
selector:'child',
template:`
child{{content}}
`
})
classChild{
@Input()content:string;
}
@Component({
selector:'App',
directives:[Child],
template:`
App
`
})
exportclassApp{
i:number=0;
constructor(){
setInterval(()=>{
this.i++;
},1000)
}
}
子->父output方式
import{Output,EventEmitter,Component}from'angular2/core';
@Component({
selector:'child',
template:`
child
`
})
classChild{
@Output()updateNumberI:EventEmitter=newEventEmitter();
i:number=0;
constructor(){
setInterval(()=>{
this.updateNumberI.emit(++this.i);
},1000)
}
}
@Component({
selector:'App',
directives:[Child],
template:`
App{{i}}
`
})
exportclassApp{
i:number=0;
numberIChange(i:number){
this.i=i;
}
}
子获得父实例
如果不了解forwardRef用处的的可以看#11
@Host表示这个Injector必须是hostelement在这里可以理解为parent
import{Host,Component,forwardRef}from'angular2/core';
@Component({
selector:'child',
template:`
child
`
})
classChild{
constructor(@Host()@Inject(forwardRef(()=>App))app:App){
setInterval(()=>{
app.i++;
},1000);
}
}
@Component({
selector:'App',
directives:[Child],
template:`
App{{i}}
`
})
exportclassApp{
i:number=0;
}
父获得子实例
子元素指令在父constructor时是获取不到的,所以必须在组件的ngAfterViewInit生命周期钩子后才能获取,如果对组件生命周期不了解的话,可以参考#56
import{ViewChild,Component}from'angular2/core';
@Component({
selector:'child',
template:`
child{{i}}
`
})
classChild{
i:number=0;
}
@Component({
selector:'App',
directives:[Child],
template:`
App{{i}}
`
})
exportclassApp{
@ViewChild(Child)child:Child;
ngAfterViewInit(){
setInterval(()=>{
this.child.i++;
},1000)
}
}
service方式
import{Component,Injectable}from'angular2/core';
@Injectable();
classKittencupService{
i:number=0;
}
@Component({
selector:'child',
template:`
child{{service.i}}
`
})
classChild{
constructor(publicservice:KittencupService){
}
}
@Component({
selector:'App',
directives:[Child],
providers:[KittencupService],
template:`
App{{i}}
`
})
exportclassApp{
constructor(service:KittencupService){
setInterval(()=>{
service.i++;
},1000)
}
}
serviceEventEmitter方式
import{Component,Injectable,EventEmitter}from'angular2/core';
@Injectable()
classKittencupService{
change:EventEmitter;
constructor(){
this.change=newEventEmitter();
}
}
@Component({
selector:'child',
template:`
child{{i}}
`
})
classChild{
publici:number=0;
constructor(publicservice:KittencupService){
service.change.subscribe((value:number)=>{
this.i=value;
})
}
}
@Component({
selector:'App',
directives:[Child],
providers:[KittencupService],
template:`
App{{i}}
`
})
exportclassApp{
i:number=0;
constructor(service:KittencupService){
setInterval(()=>{
service.change.emit(++this.i);
},1000)
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。