【译】Angular中,向子组件传值的5种方式

翻译:http://blog.briebug.com/5-ways-to-pass-data-into-child-components-in-angular    原作者:

前言

如果你是新手,或翻译angularJs的项目代码时,第一个要想的可能是:我如何向周围传值

本文,让我们跟随 accompanying demo app  的示例来阐述下面5个技术:

  1. @Input来响应变化的值
  2. @ViewChild来设置属性
  3. 在services中使用BehaviorSubjects
  4. 使用Angular Router
  5. 使用NgRx

我会从最基本的开始,最后整个会变得很复杂。它们每一个技术都能适应众多的场景,但由你来决定你的app中, 最终使用哪个技术!

Inputs

Inputs 是最简单最直接的传值到子组件内的方式。只需要添加input 装饰器到相应的属性,如下:

@Input() price:number;

在模板文件中,它只是一个属性,你可以用  [ ] 来绑定它的值,也可以传入静态值。

<my-component [price]="500"></my-component>
<my-component price="One kajillion dollars"></my-component>

你也可以向属性传入方法,静态值,表达式,你甚至可以传入一个异步的observable管道,它会自动取出其中的值。之后在你的组件中,这个属性能够一直指向最后一次的emitted值。

<my-component [profile]="user$ | async"></my-component>

子组件可以使用ngOnChanges 以及 getter ,setter属性来响应父组件内的变化,仔细看一下例子吧!

ViewChild

使用ViewChild,你可以操作子组件内的属性以及方法。在动态插入组件或元素时,你可以通过子组件的类或模板引用变量的方式,来直接引用子组件,这技术就会得心应手。 要使用ViewChild,需要传入子组件的类或是模板引用变量,这样在父组件内轻易的得到属性指向子组件。

这个声明只会查询组件内第一个PriceComponent的实例:

@ViewChild(PriceComponent) priceComponent;

如果你的模板中使用引用变量:

<app-price-component #price></app-price-component 

下面的声明能让你创建一个它的引用

@ViewChild('price') priceComponent;

 

在服务中使用BehaviorSubjects

BehaviorSubjects是让你在app内部共享数据的一个简单的方式。Observable的模式,让你能随时dgtdv生成父,子组件内的事件,因为它就共用同一个实例。

首先创建一个包含BehaviorSubject的服务,然后添加一个函数,来更新BehaviorSubject。 在组件中注入该服务,然后调用这个函数来更新数据值,以及订阅这个BehaviorSubject,就是这么容易!

比如:9d758f70dd26eba524449e57e61c6352e08.jpg

在组件中,注入一个public 的服务变量,
constructor(public service: BitcoinService) {} 
触发事件:this.service.augmentValue(val);

在组件的模板中,可以用管道订阅值:<p>{{ service.bitcoinValueSubject | async | currency }}</p> 

Router

Router 是一个在app内管理状态的方法,当你点击连接同时Url变化时。当路由到子组件时,可以访问到路由参数:route params,这非常有用。使用路由解析的技术,可以让你在路由中传递有意义的信息!

路由解析器:Route resolvers  是在路由跳转时,会先挂起,直到Observable 返回信息时,才进行路由到页面。

比如:91517a8403e5b287f769ce3314d398cb7ac.jpg

为了使用这个路由解析器,必须在路由配置中添加:
{
 path: ':symbol',
component: PriceComponent,
resolve: { coinData: CryptoResolver }
}

在组件内部使用时,会立即取到数据:

44b079137e2d3bba6a18f2f3c695383f6a1.jpg

NgRx

NgRx是一个强壮的,功能强大的状态管理系统,它基于redux,它具有响应开发,是一个observable的封装!

在组件内取数据:entities$ = this.store.pipe(select(getAllEntitiesAsArray)); 

在组件内修改或删除数据:this.store.dispatch(new EntityAction({ entity: this.myEntity }));

在此时,ajax请求会更高效,因为data会缓存,但仍与服务端保持同步更新!在小应用中,NgRx不是必须的,但是当构建一个大的企业级yietjf,它就很好用。

Ngrx需要配置一些文件,但 BrieBug 创建 一个项目,让你通过cli 来生成这些文件—— ngrx-entity-schematic 。它自动创建actions,reducers,帮你命名一切。你只用定义model,然后关联到后台服务即可!

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/1540190/blog/2962105

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值