angular 中间人模式

本文介绍了一个使用Angular框架实现的简单应用程序,展示了如何通过组件之间的通信来更新UI。具体包括了如何定义和使用自定义事件发射器(EventEmitter),以及如何在父组件中监听子组件发出的事件。
import { Component, OnInit, EventEmitter, Output } from '@angular/core';

@Component({
  selector: 'app-order-change',
  templateUrl: './order-change.component.html',
  styleUrls: ['./order-change.component.css']
})
export class OrderChangeComponent implements OnInit {

  name = 'IBM';
  count: number;
  @Output()
  price: EventEmitter<Product> = new EventEmitter();

  @Output()
  priceA: EventEmitter<Product> = new EventEmitter();

  constructor() { }

  ngOnInit() {
    setInterval(() => {
      const product = new Product(this.name, 100 * Math.random());
      this.count = product.price;
      this.price.emit(product);
    }, 1000);
  }

  sentPrice() {
    this.priceA.emit(new Product(this.name, this.count * 100));
  }
}

export class Product {
  constructor(public name: string, public price: number) { }
}
<p>
  买{{count | number:'2.1-4'}}手{{name}}产品
</p>
<button (click)="sentPrice()">点</button>
import { Component } from '@angular/core';
import { Product } from './order-change/order-change.component';


@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  orderName: string;
  count: number;

  price: Product = new Product('', 0);

  priceHandler(event: Product) {
    this.price = event;
  }
}
<app-order-change (priceA)="priceHandler($event)"></app-order-change>
<app-order [test]='price'></app-order>
import { Component, OnInit, Input } from '@angular/core';
import { Product } from '../order-change/order-change.component';

@Component({
  selector: 'app-order',
  templateUrl: './order.component.html',
  styleUrls: ['./order.component.css']
})
export class OrderComponent implements OnInit {

  @Input()
  orderName: string;

  @Input()
  count: number;

  @Input()
  test: Product;

  constructor() { }

  ngOnInit() {

  }

}
<p>
  买{{test.name}}手{{test.price}}产品
</p>

 

转载于:https://www.cnblogs.com/chenyishi/p/8932318.html

<think>嗯,用户问的是Angular中兄弟组件之间如何传参。我需要根据之前提供的引用内容来整理答案。首先,引用里提到了几种方法,比如使用服务、RxJS的Subject或者BehaviorSubject,还有父组件作为中介。 用户可能已经了解父子组件传参,但兄弟组件之间的传参需要不同的方法。我应该先介绍最常用的方法,比如使用服务,因为引用中的[3]、[4]、[5]都提到了服务的方式,特别是用RxJS的Subject。这是Angular推荐的做法,利用可观察对象来实现通信。 然后,可能需要提到通过父组件中转的方法,如引用[2]中的例子,父组件传递数据给子组件,但兄弟组件需要父组件作为中间人。不过这种方法可能在层级复杂时不够高效,所以可以作为备选方案。 还要注意用户可能对RxJS不太熟悉,所以需要简单说明Subject和Observable的作用。例如,服务中的Subject用于发送数据,而组件通过订阅Observable来接收数据。 另外,引用[5]提到使用Subject转化为Observable,并通过next()发送值,这应该详细说明步骤,包括创建服务、在发送方调用next()、接收方订阅等。 需要检查是否有其他方法,比如使用状态管理库如NgRx,但引用中没有提到,可能用户的需求是基础方法,所以暂时不提。 最后,要确保步骤清晰,代码示例正确,比如服务中的Injectable装饰器,提供方式(provideIn: 'root'),以及组件中如何注入服务并调用方法。 可能还需要比较不同方法的优缺点,比如服务方法适合任意组件间通信,而父组件中转适合结构简单的情况。这样用户可以根据项目需求选择合适的方法。 还要注意用户的问题可能涉及到实际应用中的问题,比如生命周期中的订阅管理,需要提醒取消订阅以避免内存泄漏,比如在ngOnDestroy中取消订阅。 总结回答结构:先总述三种方法,然后分点详细说明每种方法的步骤和代码示例,最后给出方法对比和选择建议,最后相关问题部分可以引导用户深入学习。</think>在Angular中实现兄弟组件间的参数传递,主要有以下三种主流方法。以下将按实现复杂度从低到高逐步说明,并附关键代码示例: ### 一、通过共享服务实现(推荐方案) 这是Angular官方推荐的通信方式,利用RxJS的观察者模式实现[^3][^4][^5]: ```typescript // 1. 创建共享服务 @Injectable({ providedIn: 'root' }) export class BrotherService { // 创建Subject作为消息通道 private messageSource = new Subject<string>(); // 暴露为可观察对象 message$ = this.messageSource.asObservable(); sendMessage(msg: string) { this.messageSource.next(msg); } } // 2. 发送方组件 @Component({...}) export class SenderComponent { constructor(private brotherService: BrotherService) {} send() { this.brotherService.sendMessage('Hello from brother!'); } } // 3. 接收方组件 @Component({...}) export class ReceiverComponent implements OnInit { constructor(private brotherService: BrotherService) {} ngOnInit() { this.brotherService.message$.subscribe(msg => { console.log('Received:', msg); }); } } ``` **注意事项**: - 必须通过服务提供的`Observable`进行订阅,而不是直接操作Subject - 推荐使用`BehaviorSubject`如果需要保留最新值[^5] - 组件销毁时要取消订阅防止内存泄漏 ### 二、通过父组件中转 适用于存在共同父组件的场景[^2]: ```typescript // 父组件模板 <app-sender (send)="onSend($event)"></app-sender> <app-receiver [message]="currentMessage"></app-receiver> // 父组件逻辑 export class ParentComponent { currentMessage = ''; onSend(msg: string) { this.currentMessage = msg; } } ``` **适用场景**:组件层级较浅且通信频率较低时 ### 三、使用状态管理库(进阶方案) 对于复杂应用推荐使用NgRx或Akita,但需注意学习成本: ```typescript // 通过NgRx Store管理状态 this.store.dispatch(new SetMessageAction(message)); ``` ### 方法对比表 | 方法 | 适用场景 | 维护成本 | 实时性 | |-----------------|--------------|----------|-----------| | 共享服务 | 任意组件间通信 | 中 | 实时 | | 父组件中转 | 简单层级结构 | 低 | 非实时 | | 状态管理 | 大型复杂应用 | 高 | 可配置实时 | ### 常见问题解决方案 1. **消息延迟问题**:改用`BehaviorSubject`初始化默认值 2. **多次触发问题**:使用`pipe(takeUntil(componentDestroyed$))`管理订阅生命周期 3. **类型安全问题**:使用泛型定义消息类型 ```typescript private messageSource = new Subject<CustomMessage>(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值