Angular 2 Input

前端之家收集整理的这篇文章主要介绍了Angular 2 Input前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

更新时间 - 2017-03-22

Input 是属性装饰器,用来定义组件内的输入属性。在实际应用场合,我们主要用来实现父组件向子组件传递数据。Angular 应用是由各式各样的组件组成,当应用启动时,Angular 会从根组件开始启动,并解析整棵组件树,数据由上而下流下下一级子组件。

@Input()

counter.component.ts

  1. import { Component,Input } from '@angular/core';
  2.  
  3. @Component({
  4. selector: 'exe-counter',template: `
  5. <p>当前值: {{ count }}</p>
  6. <button (click)="increment()"> + </button>
  7. <button (click)="decrement()"> - </button>
  8. `
  9. })
  10. export class CounterComponent {
  11. @Input() count: number = 0;
  12.  
  13. increment() {
  14. this.count++;
  15. }
  16.  
  17. decrement() {
  18. this.count--;
  19. }
  20. }

app.component.ts

  1. import { Component } from '@angular/core';
  2.  
  3. @Component({
  4. selector: 'exe-app',template: `
  5. <exe-counter [count]="initialCount"></exe-counter>
  6. `
  7. })
  8. export class AppComponent {
  9. initialCount: number = 5;
  10. }

以上代码运行后浏览器显示的结果:

@Input('bindingPropertyName')

Input 装饰器支持一个可选的参数,用来指定组件绑定属性名称。如果没有指定,则默认使用 @Input 装饰器,装饰的属性名。具体示例如下:

counter.component.ts

  1. import { Component,template: `
  2. <p>当前值: {{ count }}</p>
  3. <button (click)="increment()"> + </button>
  4. <button (click)="decrement()"> - </button>
  5. `
  6. })
  7. export class CounterComponent {
  8. @Input('value') count: number = 0;
  9. ... // 其余代码未改变
  10. }

app.component.ts

  1. import { Component } from '@angular/core';
  2.  
  3. @Component({
  4. selector: 'exe-app',template: `
  5. <exe-counter [value]="initialCount"></exe-counter>
  6. `
  7. })
  8. export class AppComponent {
  9. initialCount: number = 5;
  10. }

@Component() - inputs

  1. import { Component,template: `
  2. <p>当前值: {{ count }}</p>
  3. <button (click)="increment()"> + </button>
  4. <button (click)="decrement()"> - </button>
  5. `,inputs:['count:value'] // 类成员属性名称:绑定的输入属性名称
  6. })
  7. export class CounterComponent {
  8.  
  9. count: number = 0;
  10.  
  11. increment() {
  12. this.count++;
  13. }
  14.  
  15. decrement() {
  16. this.count--;
  17. }
  18. }

setter & getter

setter 和 getter 是用来约束属性的设置和获取,它们提供了一些属性读写的封装,可以让代码更便捷,更具可扩展性。通过 setter 和 getter 方式,我们对类中的私有属性进行了封装,能避免外界操作影响到该私有属性。此外通过 setter 我们还可以封装一些业务逻辑,具体示例如下:

counter.component.ts

  1. import { Component,template: `
  2. <p>当前值: {{ count }} </p>
  3. <button (click)="increment()"> + </button>
  4. <button (click)="decrement()"> - </button>
  5. `
  6. })
  7. export class CounterComponent {
  8. _count: number = 0; // 默认私有属性以下划线开头,不是必须也可以使用$count
  9. biggerThanTen: boolean = false;
  10.  
  11. @Input()
  12. set count (num: number) {
  13. this.biggerThanTen = num > 10;
  14. this._count = num;
  15. }
  16.  
  17. get count(): number {
  18. return this._count;
  19. }
  20.  
  21. increment() {
  22. this.count++;
  23. }
  24.  
  25. decrement() {
  26. this.count--;
  27. }
  28. }

ngOnChanges

当数据绑定输入属性的值发生变化的时候,Angular 将会主动调用 ngOnChanges 方法。它会获得一个 SimpleChanges 对象,包含绑定属性的新值和旧值,它主要用于监测组件输入属性的变化。具体示例如下:

  1. import { Component,Input,SimpleChanges,OnChanges } from '@angular/core';
  2.  
  3. @Component({
  4. selector: 'exe-counter',template: `
  5. <p>当前值: {{ count }}</p>
  6. <button (click)="increment()"> + </button>
  7. <button (click)="decrement()"> - </button>
  8. `
  9. })
  10. export class CounterComponent implements OnChanges{
  11. @Input() count: number = 0;
  12.  
  13. ngOnChanges(changes: SimpleChanges) {
  14. console.dir(changes['count']);
  15. }
  16.  
  17. increment() {
  18. this.count++;
  19. }
  20.  
  21. decrement() {
  22. this.count--;
  23. }
  24. }

以上代码运行后浏览器显示的结果:

上面例子中需要注意的是,当手动改变输入属性的值,是不会触发 ngOnChanges 钩子的。

我有话说

1.在构造函数中是获取不到输入属性的值

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

具体详情可参考 - Angular 2 constructor & ngOnInit

2.不能同时使用 @Input 装饰器 或在 @Directive、@Component inputs 字段中定义同一个输入属性,具体示例如下:

  1. @Component({
  2. selector: 'exe-counter',inputs:['count:value']
  3. })
  4. export class CounterComponent {
  5. @Input('value') count: number = 0;
  6. }

3.@Input vs inputs

相同点:

  • 它们都是用来定义输入属性

异同点:

  • inputs 定义在指令的 Metadata 信息中,开发者对指令的输入属性一目了然。此外对于未选用 TypeScript 作为开发语言的开发者,也只能在 Metadata 中定义指令的输入属性

  • @Input 属于属性装饰器,通过它我们可以一起定义属性的访问描述符 (public、private、protected):

  1. @Input() public attr: string;

4.输入、输出属性风格指南

4.1 坚持使用 @Input 和 @Output ,而非 @Directive 和 @Component 装饰器的 inputs 和 outputs 属性

4.2 坚持把 @Input 或者 @Output 放到所装饰的属性的同一行:

  • 如果需要重命名@Input或者@Output关联的属性或事件名,你可以在一个位置修改

4.3 避免为输入和输出属性指定别名

  • 同一个属性有两个名字(一个对内一个对外)很容易导致混淆。

详细信息请参考 - Angular 2 风格指南 - STYLE 05-12

5.项目开发中尽量通过 @Input 装饰器定义无状态的组件,即组件仅依赖于输入属性,这样会大大提高组件可复用性

猜你在找的Angularjs相关文章