组件之间的共享可以有好几种方式
http://learnangular2.com/outputs/ 实例参考
https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#parent-to-child实例参考
http://learnangular2.com/viewChild/ 实例参考
父->子 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) } }
查看更多关于Angular 2 组件之间如何通信?的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did223108