Angular组件交互

Stella981
• 阅读 680

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

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

//子组件中内容
@Input() 绑定的属性名: 值类型;  //其值等于在父模板中绑定变量的值

//父组件模板中
<子组件标签 [绑定的属性名]="变量"></子组件标签>

//父组件类中
定义变量值...

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

//子组件
import { EventEmitter, Output } from '@angualr/core'

...

@Output() 绑定的属性名: new EventEmitter<值类型>;

export class ...{
  ...
  某个方法() {
    this.绑定的属性名.emit(发送的东西);
  }
}

//子组件模板
<p (事件)="某个方法">...</p>

//父组件模板
<子组件标签 (绑定的属性名)="父组件方法($event)"></子组件标签>

//父组件类
父组件方法(形参_接收到的东西) {
  //表达式
  ...
}

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

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

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

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

setter拦截输入属性

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

比如:

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

ngOnChanges监听数据变化

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

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

import { SimpleChanges,OnChanges } from '@angular/core';

  cc:Array<any>=[];
  ngOnChanges(changes: SimpleChanges) {
    for (let aa in changes) {                 //不知道怎么监听指定输入属性...好了先不管他
      let chng = changes[aa];
      let cur  = chng.currentValue;
      let prev = JSON.stringify(chng.previousValue);   //可以设置格式
      this.cc.push(`${cur},${prev}`);
    }

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

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

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

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

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

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

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

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

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

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

@ViewChild(子组件类名/模板局部变量) 名字: 子组件类;

//现在就可以在父组件中引用子组件了。

非父子组件交互

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

//服务类A
import { Injectable } from '@angular/core';

import { 组件A } from './组件A';

@Injectable()
export class ServiceA {
  .......
  //对组件A的数据什么的进行操作,返回数据什么的
}

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

  //组件B
  import { Component, OnInit } from '@angular/core';

  import { ServiceA } from './servicea';

  ...
  providers: [ServiceA]    //注册一下,创建一个服务A的实例
  ...

  export class AppComponent implements OnInit {
  
  constructor(private servicea: ServiceA) { }  //定义一个私有属性

  函数(): void {
    this.servicea.里面的方法();
  }
  ngOnInit(): void {
    this.函数();
  }
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
taro 组件的外部样式和全局样式
自定义组件对应的样式文件,只对该组件内的节点生效。编写组件样式时,需要注意以下几点:1.组件和引用组件的页面不能使用id选择器(a)、属性选择器(\a\)和标签名选择器,请改用class选择器。2.组件和引用组件的页面中使用后代选择器(.a.b)在一些极端情况下会有非预期的表现,如遇,请避免使用。3.子
Stella981 Stella981
2年前
Angular 1 深度解析:组件化编程
angular1也要面向组件编程前端组件化是前端开发模式中一个不可逆转的趋势,三大主要前端框架angular2reactvue都不约而同的把组件化编程作为自己的一大卖点,angular1作为一个历史相对悠久的框架,在私生子angular2的推动下,终于也搭上了组件化编程的末
Stella981 Stella981
2年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这