经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » AngularJS » 查看文章
angular的输入和输出的使用方法
来源:jb51  时间:2018/9/25 19:02:03  对本文有异议

angular的核心组件化,可以说组件化的相当彻底。而要实现组件之间的通信,一个必不可少的就是输入和输出。通过对输入输出的学习,更加加深我对组件化的认识。

组件的输入

angular允许使用两种形式来定义组件的输入,一种是在装饰器@Component中使用inputs来定义,另一种是使用@Input来定义。

inputs

首先先介绍在装饰器中使用的输入。inputs接收的是一个字符串数组,用来指定我们输入的键名。

  1. @Component({
  2.  selector: 'my-component',
  3.  inputs: ['name']
  4. })
  5. class MyComponent {
  6.  name: string;
  7. }

name就会对应我们组件中的name变量。

然后我们定义一个组件,当然不可避免有的时候会在其他的组件的模板中使用,所以就可以这样写。

上级组件

  1. export class AppComponent {
  2.  myName = 'zhangsan';
  3.  ...
  4. }

上级组件的模板

  1. <app-messages [name]="myName"></app-messages>
方括号[]:数据绑定,也叫输入绑定。将等号右边的变量绑定在左边[]中的变量上。

我们的组件

  1. @Component({
  2.  selector: 'app-messages',
  3.  inputs: ['name'],
  4.  templateUrl: './messages.component.html',
  5.  styleUrls: ['./messages.component.css']
  6. })
  7. export class MessagesComponent implements OnInit {
  8.  name: string;
  9. }

这里我们就用name接受了上级组件的myName


通过上面的图,就很容易看输入数据的对应关系。

然后我们打印一下看看变量是否成功输入了。

  1. export class MessagesComponent implements OnInit {
  2.  name: string;
  3.  
  4.  ngOnInit() {
  5.   console.log(this.name);
  6.  }
  7. }

成功输入!

@Input

上面我们实现了组件的数据输入,但是angular并没有满足现状,还提供另外一种输入的方法,就是@Input

  1. @Component({
  2.  selector: 'my-component'
  3. })
  4. class MyComponent {
  5.  @Input() name: string;
  6. }

只要在我们的组件中定义变量的时候使用@Input装饰器就行了。对比上面我们使用inputs时,少了一个二次声明。这种方法感觉数据的传递少了一层关系,更加易于理解,而且代码也更加的工整。

组件输出

说完了组件的输入,下面我们就该聊聊组件的输出了。要将数据从组件中传递出去,就要使用输出绑定

  1. <button (click)="display()"></button>
圆括号(): 事件绑定,又叫输出绑定。这里我们监听click事件,然后触发display方法。

除了click,angular还有很多内置的事件,当然,我们在编写自己的组件的时候,也可以自定义一个事件,来与外部通信。

自定义事件

自定义的事件需要做三件事情:

1.在@Component配置中,制定outputs配置项
2.在配置的属性中,设置一个EventEmitter(事件触发器)
3.在适当的时候,也就是要触发的方法中,通过EventEmitter触发事件

下面看一下示例:

  1. @Component({
  2.  selector: 'my-component',
  3.  outputs: ['newEvent']
  4. })
  5. export class MyComponent {
  6.  newEvent: EventEmitter<string>;
  7.  
  8.  constructor() {
  9.   this.newEvent = new EventEmitter();
  10.  }
  11.  
  12.  display(): void {
  13.   this.newEvent.emit("test event");
  14.  }
  15. }

然后我们就可以通过上面模板中的代码实现输出了。

如果想在一个父级的组件中使用这个输出,就要使用我们自己的事件了。下面看一个示例:

父级组件:

  1. export class AppComponent {
  2.  ...
  3.  showEvent(message: string) {
  4.   console.log(`hello: ${message}`);
  5.  }
  6. }

父级模板:

  1. <app-messages (newEvent)="showEvent($event)"></app-messages>

我们的组件:

  1. @Component({
  2.  selector: 'app-messages',
  3.  outputs: ['newEvent'],
  4.  templateUrl: './messages.component.html'
  5. })
  6. export class MessagesComponent {
  7.  newEvent: EventEmitter<string>;
  8.  
  9.  constructor(private messageService: MessageService) {
  10.   this.newEvent = new EventEmitter();
  11.  }
  12.  
  13.  display(): void {
  14.   this.newEvent.emit('test event');
  15.  }
  16. }

我们的组件模板:

  1. <button (click)="display()">触发</button>
引用文字

然后点击触发,可以看到输出hello:test event。数据输出成功!

好了我们再来梳理整个输出过程:

1.我们自定以一个组件,通过内置的click事件触发display方法,这时就会触发我们自定义的事件:newEvent

2.当事件触发的时候,他会执行上一级的方法:showEvent

3.我们的事件输出了一个字符串test event,然后通过$event获取这个输出结果,并当做参数传给上一级的方法showEvent

@Output

同输入相同,angular也为我们提供了输出的第二种方式:@Output

用法与@input类似:

  1. export class MessagesComponent {
  2.  @Output() newEvent: EventEmitter<string>;
  3. }

只有在定义的时候,省去了重新声明的一步。

官方参考:https://angular.io/api/core/Component

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号