Angular中的输入输出是经过注解@Input
和@Output
来标识,它位于组件控制器的属性上方。
输入输出针对的对象是父子组件。html
connInComponents
:ng new connInComponents
.stock
:ng g component stock
.stock.component.ts
中新增属性stockName
并将其标记为输入@Input()
:@Input() protected stockName: string;
@Input()
则应有对应的父组件,此处使用默认生成的主组件app
.keyWork
并经过视图文件app.component.html
中的标签<input>
来进行双向绑定,最后,在视图文件app.component.html
中嵌入子组件并进行赋值://ts protected keyWord: string; //html <input placeholder="请输入股票名称" [(ngModel)]="keyWord"> <app-stock [stockName]="keyWord"></app-stock>
注意,[(ngModel)]
须要在app.module.ts
中引入模块FormsModule
。
这样就完成了父组件向子组件赋值的操做了。app
<p> stock works! </p> <div> 股票名称:{{stockName}} </div>
Output
的赋值操做不像Input
那样简单,它须要经过位于@angular/core
包下的EventEmitter
对象来监听并处理数据。而且须要传入泛型类来规定参数类型。dom
在父子组件中各自定义一个表示股票价格的属性,并经过Output
将子组件中的价格信息传给父组件。this
EventEmitter
须要传入泛型类,所以咱们首先定义一个股票信息类:export class StockInfo { constructor(public name: string, public price: number) { this.name = name; this.price = price; } }
stock.component.ts
中新增属性stockPrice
和event
,并在初始化方法中为stockPrice
赋值并经过event
将当前绑定对象发射出去:protected stockPrice: number; @Output() protected event: EventEmitter<StockInfo> = new EventEmitter(); ngOnInit() { setInterval(() => { const stock: StockInfo = new StockInfo(this.stockName, 100 * Math.random()); this.stockPrice = stock.price; this.event.emit(stock); }, 3000); }
此时子组件的发射动做已完成,那么如何接收发射的数据呢?双向绑定
currentPrice
和接收方法eventHandler
:protected currentPrice: number; eventHandler(stock: StockInfo) { this.currentPrice = stock.price; }
<app-stock>
上添加绑定关系:<app-stock [stockName]="keyWord" (event)="eventHandler($event)"></app-stock>
其中event
对应子组件属性,eventHandler
对应父组件接收并处理子组件传来的方法,$event
表明泛型类参数,此处是一个类型为StockInfo
的实例。code
此时赋值操做已经完成,在父子组件的视图文件中添加显示接收到的信息(股票价格)便可:
stock.component.htmlcomponent
<div> 股票名称:{{stockName}}<br>当前价格:{{stockPrice | number:'2.1-2'}} </div>
app.component.htmlorm
<div> 股票名称:{{keyWord}}<br>当前价格:{{currentPrice | number:'2.1-2'}} </div>
@Output
能够传递参数,其值与嵌入的子组件视图元素<app-stock>
上绑定的数据名称统一。
如@Output('lastPrice')
,那么htm
<app-stock [stockName]="keyWord" (event)="eventHandler($event)"></app-stock>
相应改成:对象
<app-stock [stockName]="keyWord" (lastPrice)="eventHandler($event)"></app-stock>