Angular组件交互

Angular2中的组件交互方式很多,可分为父子组件交互和非父子组件交互两种情况。

在学习之前需要了解组件的@Input@Output的用法

1//子组件中内容 2@Input() 绑定的属性名: 值类型; //其值等于在父模板中绑定变量的值 3 4//父组件模板中 5<子组件标签 [绑定的属性名]="变量"></子组件标签> 6 7//父组件类中 8定义变量值...

**@Input**修饰的“属性名”属于输入属性,这个输入属性从其父组件中获取数据。Input就是把父组件中的数据拿到子组件中处理。注意Input()只有指令才能设置别名

1//子组件 2import { EventEmitter, Output } from '@angualr/core' 3 4... 5 6@Output() 绑定的属性名: new EventEmitter<值类型>; 7 8export class ...{ 9 ... 10 某个方法() { 11 this.绑定的属性名.emit(发送的东西); 12 } 13} 14 15//子组件模板 16<p (事件)="某个方法">...</p> 17 18//父组件模板 19<子组件标签 (绑定的属性名)="父组件方法($event)"></子组件标签> 20 21//父组件类 22父组件方法(形参_接收到的东西) { 23 //表达式 24 ... 25} 26

**@Output**是以事件的形式,将数据通过EventEmitter抛出去。@Output就是在子组件模板触发事件,并返回内容到父组件中响应事件。这个东西书上还有一个名字叫做自定义事件。

父组件向自子组件传递数据

父组件的数据通过子组件的输入属性流入子组件,在子组件完成接收拦截。

接收数据的方法即上面所说的**@Input**。拦截处理方法有两种,setter拦截输入属性和ngOnChanges监听数据变化。

setter拦截输入属性

setter和getter通常配套使用,setter可以对属性进行再封装处理,在通过getter返回处理过的属性值。

比如:

1@Input() 2 set 绑定的属性名(形参接收的值: 值类型) { 3 //数据处理 4 } 5 get 绑定的属性名(){return 上面数据处理的结果}

ngOnChanges监听数据变化

ngOnChanges是Angular2组件的生命周期钩子之一,该方法接收一个对象参数,包含当前值和变化前的值。在ngOnInit之前,或当该组件数据绑定的输入属性值发生变化时会触发。

SimpleChange是Angular的一个基础类,用于处理数据的前后变化,包含两个重要的成员变量,previousValue和currentValue。

1import { SimpleChanges,OnChanges } from '@angular/core'; 2 3 cc:Array<any>=[]; 4 ngOnChanges(changes: SimpleChanges) { 5 for (let aa in changes) { //不知道怎么监听指定输入属性...好了先不管他 6 let chng = changes[aa]; 7 let cur = chng.currentValue; 8 let prev = JSON.stringify(chng.previousValue); //可以设置格式 9 this.cc.push(`${cur},${prev}`); 10 }

子组件向自父组件传递数据

除了上面的@Output以外,父组件对子组件的引用还有很多方法,这里学习两种:

  • 父组件通过局部变量获取子组件引用
  • 父组件使用@ViewChild获取子组件的引用

通过局部变量获取子组件引用

使用Angualar中的局部模板变量,通过在父组件的模板中为子组件创建一个局部变量,来获取子组件公共成员变量和函数的权限,其作用域范围仅存在于定义该模板局部变量的子组件中。

在父组件模板中的子标签上绑定一个局部变量(用#标记),来获取子组件类的实例对象。

1//父组件中 2<子组件标签 (事件)="模板变量.子组件方法或属性" #模板变量></子组件标签>

使用@ViewChild获取子组件的引用

模板变量只能在模板中使用,不能在父组件类里使用。

如果父组件需要获取到子组件中变量或者方法的读写权限时,可以通过@ViewChild注入的方式实现。

1@ViewChild(子组件类名/模板局部变量) 名字: 子组件类; 2 3//现在就可以在父组件中引用子组件了。

非父子组件交互

非父子组件之间的交互主要通过服务来完成,注意服务要用@Injectable表示该服务可注入依赖,虽然不是必须的,但还是加上的好。

1//服务类A 2import { Injectable } from '@angular/core'; 3 4import { 组件A } from './组件A'; 5 6@Injectable() 7export class ServiceA { 8 ....... 9 //对组件A的数据什么的进行操作,返回数据什么的 10}

简单来说,就是创建一个服务类A,对组件A进行操作,比如说获取数据什么的。然后在组件B中导入服务A,实例化服务A,然后就可以调用它的方法,间接取得组件A的数据什么的。

1 //组件B 2 import { Component, OnInit } from '@angular/core'; 3 4 import { ServiceA } from './servicea'; 5 6 ... 7 providers: [ServiceA] //注册一下,创建一个服务A的实例 8 ... 9 10 export class AppComponent implements OnInit { 11 12 constructor(private servicea: ServiceA) { } //定义一个私有属性 13 14 函数(): void { 15 this.servicea.里面的方法(); 16 } 17 ngOnInit(): void { 18 this.函数(); 19 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )