Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Angular2 组件(页面)之间如何传值

Angular2 组件(页面)之间如何传值

作者头像
用户1437675
发布于 2018-08-20 03:04:06
发布于 2018-08-20 03:04:06
4K00
代码可运行
举报
文章被收录于专栏:Angular&服务Angular&服务
运行总次数:0
代码可运行
组件有两种方式将数据传递:“属性绑定”和“事件绑定”。

在Angular 2中,数据和事件变化检测从上到下发生从<b>父级到子级。</b>

Angular 2事件,我们可以使用DOM事件传递模型,其中事件<b>从下到上从子到父。</b>

因此,当涉及可撤消事件传播时,Angular 2事件可以像普通HTML DOM事件一样对待。

<b>@Input()</b>装饰器定义了一组可以<b>从父组件传递的参数。</b> 例如,我们可以修改HelloComponent组件,以便name可以由父提供。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//HelloComponent 
import { Component, Input } from '@angular/core';

@Component({
    selector: 'rio-hello',
    template: '<p>Hello, {{name}}!</p>',
})

export class HelloComponent {

    @Input() name: string;

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//appComponent 
import {Component} from '@angular/core';

@Component({
    selector: 'app',
    template: `<div>
        <hello [name]="helloName"></hello>
        <hello name="beijing"></hello>
      </div>`
})
export class App {
    helloName: string;
  
    constructor() {
        this.helloName = "World";
    }
}
执行结果如下

执行后展示的形态

<b>@outputs</b> 从组件发送数据,它接受组件<b>向其父组件公开的输出参数的列表。</b>

app/counter.component.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component, EventEmitter, Input, Output } from '@angular/core';

@Component({
  selector: 'rio-counter',
  templateUrl: 'app/counter.component.html'
})
export class CounterComponent {
  @Input()  count = 0;
  @Output() result = new EventEmitter<number>();

  increment() {
    this.count++;
    this.result.emit(this.count);
  }
}

app/counter.component.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div>
  <p>Count: {{ count }}</p>
  <button (click)="increment()">Increment</button>
</div>

app/app.component.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component, OnChange } from '@angular/core';

@Component({
  selector: 'rio-app',
  templateUrl: 'app/app.component.html'
})
export class AppComponent implements OnChange {
  num = 0;
  parentCount = 0;

  ngOnChange(val: number) {
    this.parentCount = val;
  }
}

app/app.component.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div>
  Parent Num: {{ num }}<br>
  Parent Count: {{ parentCount }}
  <rio-counter [count]="num" (result)="ngOnChange($event)">
  </rio-counter>
</div>
执行结果如下

执行结果

@input + @output 绑定定义组件的公共API。在我们的模板中,我们使用 [方括号] 传递输入,使用(括号)来处理输出。

组件的要点不仅是封装,而且是可重用性。<b>@Input()</b>允许我们配置组件的特定实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 绑定到原始字符串 -->
<rio-hello name="World"></rio-hello>
<!-- 绑定到父作用域 -->
<rio-hello [name]="helloName"></rio-hello>

<b>@outputs</b> 从组件发送数据,请先定义outputs属性。它接受组件向其父组件公开的输出参数的列表。

关于双向绑定

双向数据绑定使用ngModel指令将输入和输出绑定组合为单个符号。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input [(ngModel)]="name" >   

//它幕后做的相当于

<input [ngModel]="name" (ngModelChange)="name=$event">

要创建一个支持双向绑定的组件,你必须定义一个@Output属性匹配@Input,但后缀为Change

app/counter.component.ts
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component, Input, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'rio-counter',
  templateUrl: 'app/counter.component.html'
})
export class CounterComponent {
  @Input() count = 0;
  @Output() countChange = EventEmitter<number>();

  increment() {
    this.count++;
    this.countChange.emit(this.count);
  }
}

app/counter.component.html
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div>
  <p>
    <ng-content></ng-content>
    Count: {{ count }} -
    <button (click)="increment()">Increment</button>
  </p>
</div>

app/app.component.ts
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component } from '@angular/core';

@Component({
  selector: 'rio-app',
  templateUrl: 'app/app.component.html'
})
export class AppComponent {
  number1: number;
  number2: number;
  number3: number;
  number4: number;

  constructor() {
    this.number1 = 0;
    this.number2 = 0;
    this.number3 = 0;
    this.number4 = 0;
  }

  onCountChanged(value: number) {
    this.number3 = value;
    this.number4 = value;
  }
}

app/app.module.ts
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { NgModule } '@angular/core';
import { BrowserModule }  from '@angular/platform-browser';

import { AppComponent } from './app.component';
import { CounterComponent } from './counter.component';

@NgModule({
  imports: [BrowserModule],
  declarations: [
    AppComponent,
    CounterComponent
  ],
  exports: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule {
}

运行结果如下

运行结果


<h6 align = "right">Sivona</h6>

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.05.23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Angular Input和Output
Input 是属性装饰器,用来定义组件内的输入属性。在实际应用场合,我们主要用来实现父组件向子组件传递数据。Angular 应用是由各式各样的组件组成,当应用启动时,Angular 会从根组件开始启动,并解析整棵组件树,数据由上而下流下下一级子组件。
阿宝哥
2019/11/06
2.4K0
Angular 内容投影
在介绍 content projection 之前,我们先来观察一下以下的表单。对于同一个系统来说,下面的两个表单的区别在于使用不同的标题。为了提高组件的复用性,我们可以把相同的部分抽成独立的组件,然后把不同的部分单独出来。
阿宝哥
2019/11/05
2.6K0
Angular 6.x 基础教程
若想进一步了解 Angular CLI 的详细信息,请参考 Angular CLI 终极指南。
阿宝哥
2019/11/05
15.6K0
Angular 从入坑到挖坑 - 组件食用指南
angular 入坑记录的笔记第二篇,介绍组件中的相关概念,以及如何在 angular 中通过使用组件来完成系统功能的实现
程序员宇说
2020/02/25
15.8K0
Angular 从入坑到挖坑 - 组件食用指南
Angular 英雄编辑器
应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。
HoneyMoose
2019/05/25
2.6K0
Angular 英雄编辑器
应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。
HoneyMoose
2019/05/25
2.5K0
在 Angular 应用中创建包含组件
包含组件就是指可以包含其它组件的组件, 以 Bootstrap 的卡片 (Card) 为例, 它包含页眉 (header) 、 主体 (body) 和 页脚 (footer) , 如下图所示:
beginor
2020/08/07
4.8K0
在 Angular 应用中创建包含组件
Angular快速学习笔记(3) -- 组件与模板
1. 显示数据 在 Angular 中最典型的数据显示方式,就是把 HTML 模板中的控件绑定到 Angular 组件的属性。 使用插值表达式显示组件属性 要显示组件的属性,最简单的方式就是通过插值表达式 (interpolation) 来绑定属性名。 要使用插值表达式,就把属性名包裹在双花括号里放进视图模板,如 {{myHero}}。 import { Component } from '@angular/core'; @Component({ selector: 'app-root', te
JadePeng
2018/05/28
15.3K0
详解ANGULAR2组件中的变化检测机制(对比ANGULAR1的脏检测)
组件和变化检测器 如你所知,Angular 2 应用程序是一颗组件树,而每个组件都有自己的变化检测器,这意味着应用程序也是一颗变化检测器树。顺便说一句,你可能会想。是由谁来生成变化检测器?这是个好问题,它们是由代码生成。 Angular 2 编译器为每个组件自动创建变化检测器,而且最终生成的这些代码 JavaScript VM友好代码。这也是为什么新的变化检测是快速的 (相比于 Angular 1.x 的 $digest)。基本上,每个组件可以在几毫秒内执行数万次检测。因此你的应用程序可以快速执行,而无需调
前朝楚水
2018/04/03
2.9K0
Angular 表单1--响应式表单
Angular 提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单。 本节先讲响应式表单。 最终实例demo app-component.ts
mafeifan
2019/03/08
2.6K0
Angular 组件通信的三种方式
原文:https://medium.com/@mirokoczka/3-ways-to-communicate-between-angular-components-a1e3f3304ecb
mafeifan
2019/03/05
1.6K0
Angular 动态创建组件
上面代码中,我们定义了一个简单的 AlertComponent 组件,该组件有一个输入属性 type ,用于让用户自定义提示的类型,此外还包含了一个输出属性 output,用于向外部组件输出信息。我们的自定义组件最终是一个实际的 DOM 元素,因此如果我们需要在页面中插入该元素,我们就需要考虑在哪里放置该元素。
阿宝哥
2019/11/05
3.7K0
【Angular教程】-组件初识|8月更文挑战
前提: 准备一个空的angular项目(ng new angular-course)
前端小鑫同学
2022/12/25
1.9K0
【Angular教程】-组件初识|8月更文挑战
augular 英雄之旅
组件是 Angular 应用中的基本构造块。 它们在屏幕上显示数据,监听用户输入,并且根据这些输入执行相应的动作。 像一组html的集合,可与用户交互,可复用, 创建好的项目的src目录下有个app目录,这是整个程序的根组件 app.component.ts— 组件的类代码,这是用 TypeScript 写的。
刘嘿哈
2022/10/25
1.7K0
一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序
现在我们可以app.component.html用这个替换:Angular是由Google开发的AngularJS框架的新版本。它带有一个完整的重写,以及各种改进,包括优化构建和更快的编译时间。在这个Angular 5教程中,我们将从头开始构建一个笔记应用程序。如果您一直在等待学习Angular 5,本教程适合您。
WindCoder
2018/09/19
42.7K0
一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序
Angular 2 + 折腾记 :(2)初步认识angular2,不一样的开发模式
想来想去,概念这些东西不怎么想讲,更多的是想讲点实战性的内容。 所以有些东西跳过去了,小伙伴们请去看官方文档哈;跳跃性的前进,写的不好多包涵。。。
CRPER
2018/08/28
6.2K0
【玩转腾讯云】手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件
19世纪著名的印象派画家莫奈,喜欢对着同一处景物,分别画出对象在不同时间,不同光线下的色彩变化。
Kagol
2021/04/20
7.8K0
Angular 从入坑到挖坑 - 表单控件概览
angular 入坑记录的笔记第三篇,介绍 angular 中表单控件的相关概念,了解如何在 angular 中创建一个表单,以及如何针对表单控件进行数据校验。
程序员宇说
2020/03/19
18.9K0
关于angular2通道使用ts
需求在ts 中需要把时间统一转换成2000-01-02 11:00:56 使用angular2自带通道 DatePipe //app.component.ts import { DatePipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html'
用户1437675
2018/08/20
3650
Angular ViewChild和ViewChildren
Angular 为我们提供 ViewChild 和 ViewChildren 装饰器来获取模板视图中匹配的元素。ViewChild 是属性装饰器,用来从模板视图中获取匹配的元素。视图查询在 ngAfterViewInit 钩子函数调用前完成,因此在 ngAfterViewInit 钩子函数中,就能正常获取查询的元素。
阿宝哥
2019/11/05
2.7K0
相关推荐
Angular Input和Output
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验