zoukankan      html  css  js  c++  java
  • Angular 2 组件之间如何通信?

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

    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)
        }
    
    }
  • 相关阅读:
    @RequestBody, @ResponseBody 注解详解(转)
    Maven之pom.xml配置文件详解
    搭建SpringCloud-Eureka 注册中心以及服务提供与调用 快速了解 SpringCloud-Eureka
    Springboot 之 多配置文件
    Spring Boot配置文件放在jar外部
    Spring Data JPA使用getOne方法报错:Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate
    Java内省机制
    RestTemplate发送请求并携带header信息 RestTemplate post json格式带header信息
    matlab练习程序(螺线拟合)
    mathematica练习程序(曲线的曲率与挠率)
  • 原文地址:https://www.cnblogs.com/jayruan/p/6392252.html
Copyright © 2011-2022 走看看