组件之间会有下列3种关系:

1. 父子关系

2. 兄弟关系

3. 没有直接关系

通常采用下列方式处理(某些方式是框架特有)组件间的通讯,如下:

1父子组件之间的交互(@Input/@Output/模板变量/@ViewChild)

2非父子组件(Service/localStorage)

3还可以利用Session等服务器端的解决方法

Angular组件间通讯方法:

1、父子组件之间的通讯

@Input:是属性绑定,父组件向子组件传递数据

@Output:是事件绑定,子组件向父组件传递数据的同时触发事件

1.1在父组件设置子组件上面的的属性

通过@input绑定子组件的属性,注意属性得是公开public的,私有private属性是无法传递的

es6新语法get/set.为属性提供了一个方便习惯的读/写方式, 拦截属性的存取行为。

在父组件设置该属性,就能够通过set方法来修改,从而实现在父组件设置子组件属性

子组件

import { Component, OnInit, Input } from '@angular/core';

 @Component({
selector: 'app-child',
template: '<h1>{{childTitle}}</h1>'
})
export class ChildComponent implements OnInit { private _childTitle: string = '子组件标题'; @Input()
set childTitle(childTitle: string) {
this._childTitle = childTitle;
}
get childTitle(): string {
return this._childTitle;
} constructor() { } ngOnInit() { }
}

父组件

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

 @Component({
selector: 'app-parent',
templateUrl: '<p>parent-and-child works!</p><app-child childTitle=“可设置子组件标题”></app-child>'
})
export class ParentAndChildComponent implements OnInit { constructor() { } ngOnInit() { } }

1.2父组件直接调用子组件的方法

通过模板内部定义子组件变量,在父组件上可以直接调用子组件的方法,如下:

子组件

import { Component, OnInit, Input } from '@angular/core';

 @Component({
selector: 'app-child',
templateUrl: '<p>child work</p>'
})
export class ChildComponent implements OnInit {
constructor() { } ngOnInit() { } childPrint() {
alert("来自子组件的打印");
}
}

父组件

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

 @Component({
selector: 'app-parent',
templateUrl: '<p>parent-and-child works!</p><app-child #child></app-child>
<button (click)="child.childPrint()"></button>'
})
export class ParentAndChildComponent implements OnInit { constructor() { } ngOnInit() { } }

1.3父组件接受子组件派发的事件

通过@Output在子组件绑定一个事件发射器,在父组件通过事件绑定监听该事件

这样在子组件派发一个事件,父组件就能够收到

子组件

import { Component, OnInit, Output, EventEmitter} from '@angular/core';

 @Component({
selector: 'app-child',
templateUrl: '<p>child work</p>'
})
export class ChildComponent implements OnInit { @Output()
initEmit = new EventEmitter<string>(); constructor() { } ngOnInit() {
this.initEmit.emit("子组件初始化成功");
}
}

父组件

import { Component, OnInit, Output, EventEmitter } from '@angular/core';

  @Component({
selector: 'app-parent',
templateUrl: '<p>parent-and-child works!</p><app-child (initEmit)="accept($event)"></app-child>'
})
export class ParentAndChildComponent implements OnInit { constructor() { } ngOnInit() { }
accept(msg:string) {
alert(msg);
}
}

2、没有直接关系的组件

2.1service

做一个全局单例的service,然后多个组件共享这个实例,当然就可以共享其中的成员,来进行通讯。

只需将service注入到组件中就可在组件中使用该service中提供的变量和方法。

2.2路由传值

对于2个不同路由的组件,我们也可以通过路由传递信息

假设2个路由分别为~/home,~/about

2.2.1传递一个值

url: /about/:id

<button [routerLink]="['/about',1]">跳转</button>

获取传入的值:

this.id = this.route.snapshot.params['id'];

2.2.2传递一个对象

类似于上述的传递一个值,但是不需要再路由末尾加上/:id

url: /about

<button [routerLink]="['/about']" [queryParams]="{id:12,status:true}">跳转</button> 

this.route.queryParams.subscribe((params: Params)=>{

this.id = params['id'];

this.status = params['status'];

})

3通用方式实现通讯

3.1localstorage处理

在angular中也可以使用本地存储这种比较通用的方式在组件间通讯,但本地存储有下列弊端:

1存储空间有限

2只能存储字符串

setData(){
window.localStorage.setItem("test", JSON.stringify({ key: 'test', value: }));
} getData() {
var json = window.localStorage.getItem("test");
var obj = JSON.parse(json);
console.log(obj.key);
console.log(obj.value);
}

3.2服务端处理

也可以在服务端来处理组件间的通讯问题,通过接口调用存储或获取数据

转自:https://www.cnblogs.com/banluduxing/p/9290569.html

Angular组件之间通讯的更多相关文章

  1. angular组件之间的通讯

    组件通讯,意在不同的指令和组件之间共享信息.如何在两个多个组件之间共享信息呢. 最近在项目上,组件跟组件之间可能是父子关系,兄弟关系,爷孙关系都有.....我也找找了很多关于组件之间通讯的方法,不同的 ...

  2. Angular 发布订阅模式实现不同组件之间通讯

    在我们项目中要实现不同组件之间通讯,Angular的@Input和@Output只能实现有父子组件的限制,如果是复杂跨组件实现不同组件可以通过共享变量的方式实现,比如这个博客的思路:https://w ...

  3. Android--Otto事件总线 -- 组件之间通讯框架使用 --模式解析

    前言:Otto事件总线 -- 组件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle.intent等,从activityA --- activit ...

  4. vue.js组件之间通讯的数据双向绑定----父亲把数据传递给儿子,儿子更改数据后,重新发送给父亲,父亲数据更改后,属性会重新发送个儿子,儿子刷新新数据

    vue组件是相互独立的,如果要交互通讯,这时候,就需要组件之间数据互通了 往常我们讲的都是数据传递,子传父,父传子,都没有说子和父,父与子之间的数据互通 父亲传递给儿子数据,儿子触发一个父亲方法,将最 ...

  5. angular2 组件之间通讯-使用服务通讯模式 2016.10.27 基于正式版ng2

    工作中用到ng2的组件通讯 奈何官方文档言简意赅 没说明白 自己搞明白后 整理后分享下 rxjs 不懂的看这篇文章 讲很详细 http://www.open-open.com/lib/view/ope ...

  6. angular组件之间的通信

    一.组件创建 直接使用 ng g component 的命令创建组件,会自动生成组件所需的文件,方便快捷. // 父组件 ng g component parent // 子组件 ng g compo ...

  7. angular 组件之间传值

    /** * Created by Administrator on 2017/8/28. */ var app =angular.module('app',[]); app.directive('fo ...

  8. Angular 组件之间的传值

    第一种方法(传单个或者多个参数): 主页面方法: 先添加引用:private _routes: Router, Details(PBSCode) { this._routes.navigate(['p ...

  9. vue.js组件之间通讯--父组件调用子组件的一些方法,子组件暴露一些方法,让父组件调用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

随机推荐

  1. ASP.NET MVC Core的ViewComponent

    MVC Core新增了ViewComponent的概念,直接强行理解为视图组件,用于在页面上显示可重用的内容,这部分内容包括逻辑和展示内容,而且定义为组件那么其必定是可以独立存在并且是高度可重用的. ...

  2. Tomcat源码分析——请求原理分析(上)

    前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程 ...

  3. Timer控件

    Timer控件是定期引发事件的控件,时间间隔的长度由interval属性定义,其值以毫秒为单位吗,若启用了该组件,则每个事件间隔引发一个Tick事件,Timer组件的主要方法包括start和stop, ...

  4. Java基础教程(1)--概述

    一.什么是Java语言   Java是于1996年由Sun公司发布的一种极富创造力的面向对象的程序设计语言.它不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java ...

  5. 轻松学习java可重入锁(ReentrantLock)的实现原理(转 图解)

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...

  6. python学习之老男孩python全栈第九期_day022作业

    1. 写一个求正方形周长和面积的类 class Square: def __init__(self, length): self.length = length def area(self): ret ...

  7. 面向对象,继承,浏览器,上传文件, ajax

    'use strict'; //父类 class Student2{ constructor(name){ this.name = name || 'tom'; } hello(){ console. ...

  8. BZOJ1970 [Ahoi2005] 矿藏编码

    Description 依次对每份进行编码,得S1,S2,S3,S4.该矿藏区的编码S为2S1S2S3S4. 例如上图中,矿藏区的编码为:2021010210001. 小联希望你能根据给定的编码统计出 ...

  9. BZOJ2568 [国家集训队2012]比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

  10. JavaWeb学习总结(四):Servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...