Angular组件之间通讯
组件之间会有下列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组件之间通讯的更多相关文章
- angular组件之间的通讯
组件通讯,意在不同的指令和组件之间共享信息.如何在两个多个组件之间共享信息呢. 最近在项目上,组件跟组件之间可能是父子关系,兄弟关系,爷孙关系都有.....我也找找了很多关于组件之间通讯的方法,不同的 ...
- Angular 发布订阅模式实现不同组件之间通讯
在我们项目中要实现不同组件之间通讯,Angular的@Input和@Output只能实现有父子组件的限制,如果是复杂跨组件实现不同组件可以通过共享变量的方式实现,比如这个博客的思路:https://w ...
- Android--Otto事件总线 -- 组件之间通讯框架使用 --模式解析
前言:Otto事件总线 -- 组件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle.intent等,从activityA --- activit ...
- vue.js组件之间通讯的数据双向绑定----父亲把数据传递给儿子,儿子更改数据后,重新发送给父亲,父亲数据更改后,属性会重新发送个儿子,儿子刷新新数据
vue组件是相互独立的,如果要交互通讯,这时候,就需要组件之间数据互通了 往常我们讲的都是数据传递,子传父,父传子,都没有说子和父,父与子之间的数据互通 父亲传递给儿子数据,儿子触发一个父亲方法,将最 ...
- angular2 组件之间通讯-使用服务通讯模式 2016.10.27 基于正式版ng2
工作中用到ng2的组件通讯 奈何官方文档言简意赅 没说明白 自己搞明白后 整理后分享下 rxjs 不懂的看这篇文章 讲很详细 http://www.open-open.com/lib/view/ope ...
- angular组件之间的通信
一.组件创建 直接使用 ng g component 的命令创建组件,会自动生成组件所需的文件,方便快捷. // 父组件 ng g component parent // 子组件 ng g compo ...
- angular 组件之间传值
/** * Created by Administrator on 2017/8/28. */ var app =angular.module('app',[]); app.directive('fo ...
- Angular 组件之间的传值
第一种方法(传单个或者多个参数): 主页面方法: 先添加引用:private _routes: Router, Details(PBSCode) { this._routes.navigate(['p ...
- vue.js组件之间通讯--父组件调用子组件的一些方法,子组件暴露一些方法,让父组件调用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
随机推荐
- Markdown 语法整理大集合2017
简明教程:https://ouweiya.gitbooks.io/markdown/ 1.标题 代码 注:# 后面保持空格 # h1 ## h2 ### h3 #### h4 ##### h5 ### ...
- Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案
原文出自:https://blog.csdn.net/seesun2012 这是一个execl文件导入数据库操作,使用jxl解析execl导入数据库过程出现了科学计数法,与想要导入的数据不匹配,以下是 ...
- C++/CLI 本地字符串和托管字符串之间的转换
参考: https://docs.microsoft.com/zh-cn/cpp/dotnet/overview-of-marshaling-in-cpp #include "msclr/m ...
- Java学习--jsp内置对象
九个内置对象,其中Out,request,response,session,application常用 get与post区别: request对象: response对象: 请求转发与请求重定向的区别 ...
- golang label breaks
我们在for多层嵌套时,有时候需要直接跳出所有嵌套循环, 这时候就可以用到go的label breaks特征了. 先看一个范例代码: package main import ( "f ...
- CodeForces 598B(循环数组)
对于循环数组的问题,就是找偏移K后位置 偏移后位置=起始位置+(相对位置+K)%(长度+1) #include <iostream> #include <string> #in ...
- Hibernate入门(三)—— 一对多、多对多关系
一.一对多关系 1.概念 一对多关系是关系型数据库中两个表之间的一种关系.通常在数据库层级中,两表之间是有主外键关系的.在ORM中,如何通过对象描述表之间的关系,是ORM核心. 2.Hiberna ...
- javaweb项目中绝对路径的写法理解
Tomcat的默认访问路径为http://localhost:8080,后需添加项目路径. 请求转发,是转发到本项目中的其他文件,所以在默认访问路径中添加了本项目的项目路径,故可以省略项目名称: re ...
- 收藏的几个关于php面向对象教程
面向对象的分析方法是利用面向对象的信息建模概念,如实体.关系.属性等,同时运用封装.继承.多态等机制来构造模拟现实系统的方法,学会了面向对象思想,能够大大提高php编程开发效率!本篇文章php中文网将 ...
- CSS选择器:#id和.class中间有空格和无空格的区别
相信大家都知道 .class1 .class2 和 .class1.class2 是两种不同的选择规则,但具体怎样不同呢? 首先中间有空格的情况:是选择到.class1类下的.class2类子节点,即 ...