Input与Output都是属性装饰器。

  通常用于父子组件通信使用。

@Input

  用来定义组件内的输入属性。

  .d.ts 文件中定义如下:

export interface InputDecorator {
(bindingPropertyName?: string): any;
new (bindingPropertyName?: string): any;
}

     由定义知道, 绑定的属性名是个可写参数。

   因此,我们可以这定义 Input。

  (1)不带参数名

@Input() count: number =0

    在父组件使用时,传入的参数值如下:

<app-counter [count]="parentCount"></app-counter>

   此时,在父组件传入的参数名,默认就是 count。  

  (2)带参数名

@Input('inputValue')  count: number = 0

   在父组件使用时,传入的参数值如下: 

<app-counter [inputValue]="parentCount"></app-counter>

    此时,在父组件传入的参数名,就是我们定义的属性名 inputValue。

  (3) setter & getter

   相比 @Output,@Input多了这两个属性,可以用来约束属性的设置和获取。

     语法格式如下:

@Input()
set count() {
//逻辑值处理
} get count():T{
// 逻辑处理后返回值
return ...;
}

   (4) ngOnchanges

     当数据绑定输入值属性的值发生变化时,会触发 ngOnChanges()

     语法如下:

ngOnChanges(changedEles : SimpleChange) {
// changedEles['属性名']
}

     SimpleChange 会有三个值:

previousValue: any;
currentValue: any;
firstChange: boolean;

 

@Output

   用来定义组件内的输出属性。

export interface OutputDecorator {
(bindingPropertyName?: string): any;
new (bindingPropertyName?: string): any;
}

    当子组件的数据发生变化,需要通知父组件时,常常使用 EventEmitter。 使用方法:

  1、子指令创建一个 EventEmitter 实例,作为输出属性导出。

@Output() changeCount : EventEmitter<any> = new EventEmitter<any>();

// 然后在某个时刻将信息发给父组件,一般在某个函数中
// 发送的信息可以是任何类型的
this.changeCount.emit(any)

  2、父组件通过事件名称,获取子组件发过来的数据。

// 子组件事件名称 ="父组件函数名称($event)"
// 其中,$event 就是 子组件传送过来的数据
<app-counter [count]="initialCount" (changeCount)="parentChangeCount($event)"></app-counter>

  @Input 与 @ Output综合代码如下:

子组件代码

  使用 ng g c counter 命令生成组件代码。

counter.component.html
<p>当前值: {{ count }}</p>
<button (click)="increment()"> + </button>
<button (click)="decrement()"> - </button>
import { Component, OnInit , Input, OnChanges, SimpleChanges , Output , EventEmitter} from '@angular/core';

@Component({
selector: 'app-counter',
templateUrl: './counter.component.html',
styleUrls: ['./counter.component.scss']
})
export class CounterComponent implements OnInit, OnChanges {
@Output() changeCount: EventEmitter<any> = new EventEmitter<any>();
constructor() { } ngOnInit() {
} _count: number = 0; @Input()
set count (num: number) {
this._count = num;
} get count(): number {
return this._count;
} increment() {
this.count++;
} decrement() {
this.count--;
this.changeCount.emit({
count: this._count,
fromChildFun: 'decrement'
});
} ngOnChanges(changedEles: SimpleChanges) {
console.dir(changedEles['count']);
}
}

父组件

<app-counter [count]="parentInitialCount" (changeCount)="parentChangeCount($event)"></app-counter>
parentInitialCount: number = 0;  

parentChangeCount($event) {
console.dir($event);
}

canvas(二) lineCap demo的更多相关文章

  1. HTML5 之Canvas 绘制时钟 Demo

    <!DOCTYPE html> <html> <head> <title>Canvas 之 时钟 Demo</title> <!--简 ...

  2. 分享一个非常屌的eazyui二开demo

    eazyui二开Demo非常吊,里面各种非常吊的样例,最喜欢的是 多文件进度条上传,一次可多选,还有流程,还有文本编辑器  非常简洁的 不像一些官网各种复杂的东西.主要为自己保留一份, 在线demo在 ...

  3. 基于canvas二次贝塞尔曲线绘制鲜花

    canvas中二次贝塞尔曲线参数说明: cp1x:控制点1横坐标 cp1y:控制点1纵坐标 x: 结束点1横坐标 y:结束点1纵坐标 cp2x:控制点2横坐标 cp2y:控制点2纵坐标 z:结束点2横 ...

  4. canvas画箭头demo

    效果图: 代码: <!DOCTYPE html> <html> <title>canvas画箭头demo</title> <body> &l ...

  5. canvas二三事之签名板与视频绘制

    今天,不知道怎么的就点开了语雀,然后就看到了<HTML5 Canvas 教程>,开始了canvas的研究(学习)之旅. 首先,想到的第一个东西就是签名板,上代码: <canvas i ...

  6. 第155天:canvas(二)

    一.添加样式和颜色 ​ 在前面的绘制矩形章节中,只用到了默认的线条和颜色. ​ 如果想要给图形上色,有两个重要的属性可以做到. fillStyle = color 设置图形的填充颜色 strokeSt ...

  7. canvas 画圈 demo

    html代码: <canvas id="clickCanvas2"  width="180" height="180" data-to ...

  8. RobotFrameWork接口报文测试-----(二)demo的升级版

    在上一篇,简单的demo实现了讲xml的数据发送服务器端并取得recvi_buf,然后进行了简单的解析的操作.现在就要解决之前提过的2个问题: 1. 步骤这么多,难道每写一个脚本都要重复一次么? 2. ...

  9. html 5 canvas 绘制太极demo

    一个练习canvas的小案例.其中若有小问题,欢迎大神拍砖……^_* 代码效果预览地址:http://code.w3ctech.com/detail/2500. <div class=" ...

随机推荐

  1. linux下insmod模块出现“Invalid parameters"

    在编译一个模块时,会出现WARNING:"函数名" undefined!,这 说明该模块所依赖的模块还没有加载进内核,需要先加载所依赖的模块. 当加载依赖模块后,使用insmod会 ...

  2. ajax 调用webservice 跨域问题

    注意两点 1. 在webservice的config中加入这段位置 (注意不是调用webservice的webconfig中加入) <system.webServer>     <! ...

  3. Linux查看和修改文件时间

    参考http://www.361way.com/chang-file-time/1632.html 一:查看时间 1:查看文件的具体时间信息 File: `probn' Size: Blocks: I ...

  4. pac4j探索(一)之buji-pac4j shiro整合Cas实现单点登录

    https://blog.csdn.net/hxm_code/article/details/79181218 https://blog.csdn.net/hxm_code/article/detai ...

  5. How to load custom styles at runtime (不会翻译,只有抄了 )

    原文 :http://blogs.embarcadero.com/sarinadupont/2013/10/16/how-to-load-custom-styles-at-runtime/ How t ...

  6. Excel函数之vlookup的用法

    Vlookup函数用法: 实例: 要将编号对照表中的图书名称根据两表中的图书编码字段引入 订单明细中. Vlookup函数 参数一:键入一个需要搜索的字段,这里需要通过订单明细中的图书编号在编号对照离 ...

  7. TypeScript 模块系统

    https://www.cnblogs.com/niklai/p/5808789.html

  8. React开发笔记

    项目环境搭建 使用create-react-app CSS使用styled-components yarn add styled-components 引入reset.css样式 import { c ...

  9. tkinter 写一个简易的ide

    简易IDE 基于tkinter的简易ide,参考文档和Baidu的资料制作的,过程中遇到了很多问题,也学到了很多知识. 功能: 1.菜单栏 2.编辑功能 open save... 3.快捷键  ctr ...

  10. Dubbo源码解析之registry注册中心

    阅读须知 dubbo版本:2.6.0 spring版本:4.3.8 文章中使用/* */注释的方法会做深入分析 正文注册中心是Dubbo的重要组成部分,主要用于服务的注册与发现,我们可以选择Redis ...