Angular4学习笔记(六)- Input和Output
概述
Angular中的输入输出是通过注解@Input和@Output来标识,它位于组件控制器的属性上方。
输入输出针对的对象是父子组件。
演示
Input
- 新建项目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。
这样就完成了父组件向子组件赋值的操作了。
- 在子组件中进行展示
<p>
  stock works!
</p>
<div>
  股票名称:{{stockName}}
</div>
Output
Output的赋值操作不像Input那样简单,它需要通过位于@angular/core包下的EventEmitter对象来监听并处理数据。并且需要传入泛型类来规定参数类型。
需求
在父子组件中各自定义一个表示股票价格的属性,并通过Output将子组件中的价格信息传给父组件。
- 由于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的实例。
此时赋值操作已经完成,在父子组件的视图文件中添加显示接收到的信息(股票价格)即可:
stock.component.html
<div>
  股票名称:{{stockName}}<br>当前价格:{{stockPrice | number:'2.1-2'}}
</div>
app.component.html
<div>
  股票名称:{{keyWord}}<br>当前价格:{{currentPrice | number:'2.1-2'}}
</div>
tips
@Output可以传递参数,其值与嵌入的子组件视图元素<app-stock>上绑定的数据名称统一。
如@Output('lastPrice'),那么
<app-stock [stockName]="keyWord" (event)="eventHandler($event)"></app-stock>
相应改为:
<app-stock [stockName]="keyWord" (lastPrice)="eventHandler($event)"></app-stock>
效果

Demo
Angular4学习笔记(六)- Input和Output的更多相关文章
- Angular4学习笔记-目录汇总
		Angular4学习笔记(一)-环境搭建 Angular4学习笔记(二)-在WebStorm中启动项目 Angular4学习笔记(三)- 路由 Angular4学习笔记(四)- 依赖注入 Angula ... 
- Angular4学习笔记(十)- 组件间通信
		分类 父子组件通信 非父子组件通信 实现 父子 父子组件通信一般使用@Input和@Output即可实现,参考Angular4学习笔记(六)- Input和Output 通过Subject 代码如下: ... 
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
		Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ... 
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域)  (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
		java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ... 
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
		中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ... 
- Typescript 学习笔记六:接口
		中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ... 
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
		python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ... 
- Go语言学习笔记六: 循环语句
		Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ... 
- 【opencv学习笔记六】图像的ROI区域选择与复制
		图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ... 
- Linux学习笔记(六) 进程管理
		1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ... 
随机推荐
- 用一颗学美术的心来理解PID调节
			用一颗学美术的心来理解PID调节 泡利 3 个月前 相信大家小时候都画过美术作品吧?(什么?你还是宝宝?)没关系,不管你是文科.理科.工科.艺术还是家里蹲的,这篇文章对你来说一定会简单到爆炸的. 这种 ... 
- [USACO08DEC]Secret Message
			OJ题号: 洛谷2922 思路: 字典树,每个结点记录经过该节点的字符串数cnt和以该结点结尾的字符串数量val. 每次询问时累加经过节点的val值和结尾结点的cnt值. #include<cs ... 
- python 爬虫不停换代理
			内网看到的一个小技巧,卧槽,感觉真TM厉害 函数均放到main函数内即可 def get_proxy(): url="http://www.xicidaili.com" req=u ... 
- 【熊掌号mip插件】织梦DEDECMS百度熊掌号mip改造教程
			第一部分:模板修改 1.js部分:删除或使用现有组件替换 2.调用百度mip文件: head里加<link rel="stylesheet" type="text/ ... 
- B - 可能的路径(gcd变形)
			https://vjudge.net/contest/218366#problem/B 要不是在数学题专题里,我估计就盲目搜索了.10^18范围1s应该过不去. 再细看能感觉到是gcd的变形,但是具体 ... 
- vue_axios请求封装、异常拦截统一处理
			1.前端网络请求封装.异常统一处理 vue中采用axios处理网络请求,避免请求接口重复代码,以及各种网络情况造成的异常情况的判断,采用axios请求封装和异常拦截操作: axios 请求封装 // ... 
- 从安装node js到构建一个vue并启动它
			1.安装node js 下载地址:http://nodejs.cn/download/2.安装完成后运行Node.js command prompt(node -v查看安装版本) 3.安装npm(由于 ... 
- Image Processing in Python with Pillow
			Introduction A lot of applications use digital images, and with this there is usually a need to proc ... 
- 1.1 lambda表达式
			一.处理匿名内部类 1.Runnable接口 new Thread(new Runnable() { public void run() { System.out.println("hell ... 
- Linux 安装 yum
			1.使用RedHat系统不能正常使用yum安装 由于RedHat没有注册,所有不能使用它自身的资源更新, 查看安装源是否安装: # rpm –qa|grep yum 卸载安装源: # rpm –e – ... 
