Angular如何通过服务实现deals-transaction与deals-approval组件方法同步
Angular实现DealsTransactionComponent与DealsApprovalComponent通信的两种方案
当前组件层级中DealsTransactionComponent是DealsApprovalComponent的直接父组件,可按需选择以下两种实现方案:
方案1:@ViewChild直接调用(最简洁,适配当前直接父子场景)
实现步骤:
- 第一步:修改
DealsApprovalComponent中_pageEventDealsForApprovalList方法的修饰符,从private改为public,允许父组件调用
// 去掉private修饰符即可 public _pageEventDealsForApprovalList() { // 原有方法逻辑保持不变 }
- 第二步:在
DealsTransactionComponent中引入子组件,用@ViewChild获取子组件实例
// 顶部引入子组件 import { DealsApprovalComponent } from './deals-approval.component'; export class DealsTransactionComponent implements OnInit { // 新增ViewChild声明获取子组件实例 @ViewChild(DealsApprovalComponent) dealsApprovalComp: DealsApprovalComponent; // 原有代码保持不变 }
- 第三步:在
DealsTransactionComponent的_pageEventDealsList方法执行时,触发子组件的对应方法
public _pageEventDealsList() { // 原有方法逻辑保持不变,在方法末尾/接口返回后增加以下调用 // 校验子组件实例和table实例都存在再调用,避免空指针报错 if(this.dealsApprovalComp?.table) { this.dealsApprovalComp._pageEventDealsForApprovalList(); } }
方案2:共享服务实现(适配组件层级深、跨组件通信场景)
实现步骤:
- 第一步:执行命令生成共享触发服务:
ng generate service shared/services/deal-trigger - 第二步:编写服务逻辑,用RxJS的Subject做事件流中转
import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; // 若要限制服务作用域仅在DealsTransaction相关组件内生效,可移除providedIn配置,将服务注册到DealsTransactionComponent的providers数组中 @Injectable({ providedIn: 'root' }) export class DealTriggerService { // 私有Subject不对外暴露,避免外部随意修改事件流 private readonly refreshApprovalList$ = new Subject<void>(); // 对外暴露只读的Observable,仅允许订阅 public refreshApprovalList$ = this.refreshApprovalList$.asObservable(); // 提供公共触发方法 public triggerApprovalListRefresh(): void { this.refreshApprovalList$.next(); } }
- 第三步:在
DealsTransactionComponent中注入服务,触发事件
export class DealsTransactionComponent implements OnInit { constructor( // 原有注入项保持不变,新增服务注入 private dealTriggerService: DealTriggerService ) {} public _pageEventDealsList() { // 原有逻辑保持不变,方法执行时调用服务触发事件 this.dealTriggerService.triggerApprovalListRefresh(); } }
- 第四步:在
DealsApprovalComponent中注入服务,订阅事件触发本地方法,做好内存泄漏防护
import { takeUntil } from 'rxjs/operators'; export class DealsApprovalComponent implements OnInit, OnDestroy { constructor( // 原有注入项保持不变,新增服务注入 private dealTriggerService: DealTriggerService ) {} ngOnInit(): void { // 原有逻辑保持不变,新增事件订阅 this.dealTriggerService.refreshApprovalList$ .pipe(takeUntil(this._destroyed$)) .subscribe(() => { // 校验table实例存在再调用 if(this.table) { this._pageEventDealsForApprovalList(); } }) } // 新增销毁逻辑释放订阅(如果已有可忽略) ngOnDestroy(): void { this._destroyed$.next(true); this._destroyed$.complete(); } // 同样需要把_pageEventDealsForApprovalList改为public public _pageEventDealsForApprovalList() { // 原有逻辑保持不变 } }
内容的提问来源于stack exchange,提问作者Mark Caster
相关产品推荐
相关产品推荐

