前言

在组件化开发的项目中,对于我们来说组件之间的传值是一个核心话题,父->子传值、子->父传值、兄弟组件传值。今天这篇文章不打算全部覆盖传值方式,主要来学习下input的传值方式和Injectable的传值方式

@Input()

一个装饰器,用来把某个类字段标记为输入属性,并且提供配置元数据。 声明一个可供数据绑定的输入属性,在变更检测期间,Angular 会自动更新它。

@Input()的工作方式:
父组件

@Component({
  selector: 'app',
  template: `
    <bank-account [bankName]="'RBC'" [account-id]="'4747'"></bank-account>
  `
})

class App {}

子组件

@Component({
  selector: 'bank-account',
  template: `
    Bank Name: {{bankName}}
    Account Id: {{id}}
  `
})
class BankAccount {
  @Input() bankName: string;
  @Input('account-id') id: string;
  normalizedBankName: string;
}

对就是这么简单,主要就是用于父子之间数据传递。没有其它更加复杂的东西

Injectable

标记性元数据,表示一个类可以由 Injector 进行创建。

看一个service

import { Injectable } from '@angular/core';
import { heroList } from "../mock";
@Injectable({
  providedIn: 'root'
})
export class HeroService {

  constructor() { }

  getHeroList(){
    return heroList;
  }
}

表示该服务是一个可以注入到组件中的服务
[原创]Angular依赖注入(DI)与服务service详解

那么在组件中我们可以这样使用服务:

import { Component, OnInit } from '@angular/core';
import { HeroService } from "../../shared/service/hero.service";

@Component({
  selector: 'hero-list',
  templateUrl: './hero-list.component.html',
  styleUrls: ['./hero-list.component.css'],
  providers: [HeroService]
})
export class HeroListComponent implements OnInit {

  heroList;

  constructor(
    public heroService: HeroService //constructor中注入该服务即可
  ) { }

  ngOnInit() {
    this.heroList = this.heroService.getHeroList();
  }
}

注入服务的概念也是比较简单的,其本意是分离组件对数据的操作,尽量让数据在service处理和保存,由于service是单例模式的,这样可以多个组件同时注入同一个service共用一类数据。达到组件间数据传递的效果。
[注意]使用service注入数据的方式配合rxjs使用可以事半功倍。后续也会专门写一系列文章来讲解rxjs

该使用哪个呢

在 Angular 应用中,通过 Service 来管理状态,把需要共享的数据通过 Observable 包装起来,提供相应的订阅接口即可。这样的状态流非常的简单清晰,易于维护。
对于组件通信,在 Angular 中有多种方式,我建议的方式是:

对于父 => 子,使用 @Input()
对于子 => 父,使用 @Output() EventEmitter。(其实 EventEmitter 就是一个 Observable 对象)
对于其他情况,在没有特殊需求的条件下,尽可能的使用 Service + Rxjs 的方式通信,让组件解耦。

Copyright © frankshi.com 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-05-30 09:46:01

results matching ""

    No results matching ""