解法一

概括和流程

定义了两个组件,data-transfer-two和data-transfer-two-child,由data-transfer-two引用data-transfer-two-child,实现二者之间的数据传输

data-transfer-two通过input将数据传入data-transfer-two-child
->data-transfer-two-child将数据存入form表单
->data-transfer-two定义data-transfer-two-child组件对象
->data-transfer-two通过组件对象获取data-transfer-two-child内部的相关数据

关键代码

data-transfer-two

<!--data是自定义的输入输出,输入的是数据,同时给组件取名为dataTransferTwoChild-->
<app-data-transfer-two-child #dataTransferTwoChild [data]='data'></app-data-transfer-two-child>
// 根据前端的命名获得组件
@ViewChild('dataTransferTwoChild') compDataTransferTwoChild: DataTransferTwoChildComponent; // 子组件
// 验证子组件表单
for (const i in this.compDataTransferTwoChild.childValidateForm.controls){
if (this.compDataTransferTwoChild.childValidateForm.controls[i].errors != null) {
this.msg.error('请确认表单输入');
return;
}
}
// 获得子组件数据
let childData=Object.assign(this.data, this.compDataTransferTwoChild.childValidateForm.value);

示例代码

https://github.com/zLulus/NotePractice/tree/dev3/Website/DotNetCore/CoreNgAlain/src/app/routes/data-transfer-two

解法二

概括和流程

定义了两个组件,data-transfer和data-transfer-child,由data-transfer引用data-transfer-child,实现二者之间的数据传输

data-transfer通过input将数据传入data-transfer-child
->data-transfer-child将数据存入form表单
->监控form表单数据变化,通过output调用方法通知data-transfer
->data-transfer拼凑两个组件的数据,得到结果

关键代码

data-transfer

<nz-tabset [(nzSelectedIndex)]="tabIndex">
<nz-tab nzTitle="Tab2">
<!--[]代表输入,()代表输出-->
<!--data和dataChange是自定义的输入输出,输入的是数据,输出的是方法-->
<app-data-transfer-child [data]='data' (dataChange)='getTime($event)'></app-data-transfer-child>
</nz-tab>
</nz-tabset>
/**
* @description 获得输出
*/
getTime=function(e){
// 返回表单和数据
// 这里的数据是在子组件里面emit的数据
this.data.time=e.data.time;
this.childValidateForm=e.childValidateForm;
}

data-transfer-child

<form nz-form [formGroup]="childValidateForm">
<nz-form-item>
<nz-form-label [nzSpan]="3" nzRequired>登记时间</nz-form-label>
<nz-form-control [nzSpan]="8" nzHasFeedback>
<!--使用ngModelChange随时监听数据变化-->
<nz-date-picker [nzFormat]="yyyy/MM/dd" id="_time" formControlName="time" (ngModelChange)="changeData()"></nz-date-picker>
</nz-form-control>
</nz-form-item>
</form>
// 输入
@Input() data;
// 输出
@Output() dataChange: EventEmitter<any> = new EventEmitter();
childValidateForm: FormGroup; /**
* @description 监听数据变化并返回给父组件
*/
changeData=function(){
// 因为子组件没有类似于提交的按钮,否则emit可以在点击按钮的时候调用,表单验证也可以放在子组件内
this.data=Object.assign(this.data, this.childValidateForm.value);
this.dataChange.emit({data:this.data,form:this.childValidateForm});
}

示例代码

示例代码

参考资料

Sharing Data Between Angular Components - Four Methods

Angular组件间的数据传输的更多相关文章

  1. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  2. angular组件间的通信(父子、不同组件的数据、方法的传递和调用)

    angular组件间的通信(父子.不同组件的数据.方法的传递和调用) 一.不同组件的传值(使用服务解决) 1.创建服务组件 不同组件相互传递,使用服务组件,比较方便,简单,容易.先将公共组件写在服务的 ...

  3. angular组件间的信息传递

    原文 https://www.jianshu.com/p/82207f2249c1 大纲 1.父组件向子组件传递信息:通过属性 2.子组件向父组件传递信息:通过事件 3.父组件获取子组件的信息:通过调 ...

  4. Vue组件间的数据传输

    1.父组件向子组件传输数据:自定义属性 1 //父组件 2 <Son :msg="message" :user="userinfo"></So ...

  5. Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  6. Angular : 响应式编程, 组件间通信, 表单

    Angular 响应式编程相关 ------------------------------------------------------------------------------------ ...

  7. Angular组件——父子组件通讯

    Angular组件间通讯 组件树,1号是根组件AppComponent. 组件之间松耦合,组件之间知道的越少越好. 组件4里面点击按钮,触发组件5的初始化逻辑. 传统做法:在按钮4的点击事件里调用组件 ...

  8. Angular组件之间通讯

    组件之间会有下列3种关系: 1. 父子关系 2. 兄弟关系 3. 没有直接关系 通常采用下列方式处理(某些方式是框架特有)组件间的通讯,如下: 1父子组件之间的交互(@Input/@Output/模板 ...

  9. 后端学 Angular 2 —— 组件间通信

    1. 父组件向子组件传递信息 使用@Input 子组件的属性用 @Input 进行修饰,在父组件的模板中绑定变量 例子: import { Component, OnInit, Input } fro ...

随机推荐

  1. 【MySQL】15个有用的MySQL/MariaDB性能调整和优化技巧

    MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...

  2. 【Nutch2.2.1基础教程之6】Nutch2.2.1抓取流程 分类: H3_NUTCH 2014-08-15 21:39 2530人阅读 评论(1) 收藏

    一.抓取流程概述 1.nutch抓取流程 当使用crawl命令进行抓取任务时,其基本流程步骤如下: (1)InjectorJob 开始第一个迭代 (2)GeneratorJob (3)FetcherJ ...

  3. 嵌入式linux串口编程(二)

    /*com_writer.c*/#include "uart_api.h" int main(void){ int fd; char buff[BUFFER_SIZE]; if(( ...

  4. c++ 成员函数指针

    C++中,成员指针是最为复杂的语法结构.但在事件驱动和多线程应用中被广泛用于调用回叫函数.在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数.在这样的应用中,如果不用成员指针,编程是非常困难 ...

  5. Struts2与Spring的整合

    今天倒腾了半天,终于是把这个两个框架整合到一起了.还是要写一下总结,同时给大家一些帮助. 开发环境:myeclipse 9.0(不好用!)tomcat6.0 1.准备工作 需要导入的包:struts2 ...

  6. HTML代码简写法:Emmet和Haml(转)

    HTML代码写起来很费事,因为它的标签多. 一种解决方法是采用模板, 在别人写好的骨架内,填入自己的内容.还有一种就是我今天想要介绍的方法----简写法. 常用的简写法,目前主要是Emmet和Haml ...

  7. hadoop集群ambari搭建(1)之ambari-server安装

    Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应.管理和监控. Ambari眼下已支持大多数Hadoop组件,包含HDFS.MapReduce.Hive.Pi ...

  8. JBoss AS 7之初步了解(The Return Of The King)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvam9obl9mX2xhdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. 社会化登录分享-Android SDK的二次封装和使用

    本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...

  10. HDU 1501 - dp

    传送门 题目大意: 问两个词能不能加错拼成一个第三个词. 题目分析: dp方程还是很好想:dp[i][j]表示第一个词前i个和第二个词前j个能不能拼成第三个词的前i+j个. 初始化如果s1[1] == ...