您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        组件之间的共享可以有好几种方式
父->子 input 方式
import {Component,Input} from 'angular2/core';
@Component({
  selector: 'child',
  template: `
    <h3>child {{content}}</h3>
  `
})
class Child {
  @Input() content:string;
}
@Component({
  selector: 'App',
  directives: [Child],
  template: `
    <h2>App</h2>
    <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: `
    <h3>child</h3>
  `
})
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: `
    <h2>App {{i}}</h2>
    <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: `
    <h3>child</h3>
  `
})
class Child {
  constructor(@Host() @Inject(forwardRef(()=> App)) app:App) {
    setInterval(()=> {
      app.i++;
    }, 1000);
  }
}
@Component({
  selector: 'App',
  directives: [Child],
  template: `
    <h2>App {{i}}</h2>
    <child></child>
  `
})
export class App {
  i:number = 0;
}
父获得子实例
子元素指令在父constructor时是获取不到的,所以必须在组件的ngAfterViewInit生命周期钩子后才能获取,如果对组件生命周期不了解的话,可以参考#56
import {ViewChild,Component} from 'angular2/core';
@Component({
  selector: 'child',
  template: `
    <h3>child {{i}}</h3>
  `
})
class Child {
  i:number = 0;
}
@Component({
  selector: 'App',
  directives: [Child],
  template: `
    <h2>App {{i}}</h2>
    <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: `
    <h3>child {{service.i}}</h3>
  `
})
class Child {
  constructor(public service:KittencupService){
  }
}
@Component({
  selector: 'App',
  directives: [Child],
  providers: [KittencupService],
  template: `
    <h2>App {{i}}</h2>
    <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: `
<h3>child {{i}}</h3>
`
})
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: `
<h2>App {{i}}</h2>
<child></child>
`
})
export class App {
  i:number = 0;
  constructor(service:KittencupService) {
    setInterval(()=> {
      service.change.emit(++this.i);
    }, 1000)
  }
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。