angular2 @input和@output理解

先做个比方,然后奉上代码
比如:

<talk-cmp [talk]="someExp" (click)="eventHandler($event)">

input[talk]="someExp" 这个标签可以理解为一个专门的监听器,监听父组件传递过来的someExp参数,并存入自身组件的talk变量;好像是开了个后门,允许且只允许父组件的someExp进入,一旦进入立刻抓进一个叫talk的牢房,然后子组件中就可以通过@Input来定义这个变量talk然后使用它。

output(click)="eventHandler($event)这个意思是,当子组件的事件被触发,就执行父组件的函数,并把子组件的参数event传递给父组件的eventHandler函数;就好像,当小孩子一哭(执行click事件),他的母亲立刻把他抱在怀里(执行母亲的eventHandler),同时母亲获得了小孩子的一些参数($event.rating),上面的[talk]就相当于母亲给孩子的礼物,但是孩子只能通过@input()去拿。

1、@input()

父组件 father.component.ts 提供数据

import {Component} from "@angular/core";
@Component({
    selector: "my-father",
    templateUrl: "father.html"
})
export class FatherComponent {
    data: Array<Object>;
    constructor() {
        this.data = [
            {
                "id": 1,
                "name": "html"
            },
            {
                "id": 2,
                "name": "css"
            },
            {
                "id": 3,
                "name": "angular"
            },
            {
                "id": 4,
                "name": "ionic"
            },
            {
                "id": 5,
                "name": "node"
            }
        ]
    }
}

模板文件 father.html

<h1>父组件</h1>
// 包含子组件, 并使用属性传递数据过去
<my-child [info]="data"></my-child>

子组件 child.component.ts 获取数据

import {Component, Input} from "@angular/core";
@Component({
    selector: "my-child",
    templateUrl: "child.html"
})
export class ChildComponent {   
    // 使用@Input获取传递过来的数据
    @Input()
    info: Array<Object>;
    constructor() {
    
    }
}

子组件 child.html模板文件

<ul>
    <li *ngFor="let item of info">
        {{item.name}}
    </li>
</ul>

注意:上面例子中Input的用法是静态的,即父组件只给子组件传递一次值,如果多次传值并且我们想在子组件针对不同的值做特殊处理时,那么我们需要监听input变化,可以参考另一篇文章 《Angular2 ngOnChanges用法》

注意:在构造函数中是获取不到输入属性的值

在子组件的构造函数中,是无法获取输入属性的值,只能在 ngOnChanges 或 ngOnInit 钩子中获取到。因为子组件的构造函数会优先执行,当子组件输入属性变化时会自动调用 ngOnChanges 钩子,然后在调用 ngOnInit 钩子,所以在 ngOnInit 钩子内能获取到输入的属性。

2、@Output()

子组件three-link.component.ts

1. 引入

import {Component, OnInit, Output, EventEmitter} from "@angular/core";

2. 定义输出变量

export class ThreeLinkComponent {
    province: string;
    // 输出一下参数
    @Output() provinceOut = new EventEmitter();   
    constructor() {
        this.province = "陕西";
    } 
}

3. 事件出发,发射变量给父组件

provinceChange() {
    // 选择省份的时候发射省份给父组件
    this.provinceOut.emit(this.province);
}

父组件模板

<!--三级联动组件-->
<three-link (provinceOut)="recPro($event)"></three-link>

父组件

// 函数接受子函数传递过来的变量, 子函数中emit的时候触发这个函数。
recPro(event) {
   this.province = event;
}

父组件中访问子组件中的方法

我们通过Input可以给子组件传递参数,通过output可以调用父组件方法(确切的说是异步通知父组件调用),那么如何调用子组件的方法呢?

假设子组件CircleComponent中定义了 getColorRedFun(i)方法,父组件中想调用这个方法。
1、html中添加标记 #circleComponent
2、使用@ViewChild访问子组件
3、ngAfterViewInit()以后才可以访问到获取的子组件
4、就可以通过 this.circleComponent访问子组件中的属性和方法了。

html

<page-circle #circleComponent></page-circle>

ts
export class HomePage {
  @ViewChild("circleComponent")
  circleComponent: CircleComponent;
  ngAfterViewInit() {
    console.log(this.circleComponent);
    this.circleComponent.getColorRedFun(4);
  }
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值