You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一Angular组件的save()方法中调用getComapny()方法?

解决方案:在Dialog的save()中调用公司查询逻辑

首先咱们得明确:CompanyUserPopupComponent里的getComapny()本质是调用companyService.find()获取公司数据,你要在Dialog的save()里执行这个逻辑,不能直接跨组件调用方法,得通过依赖注入+传递必要参数来实现,具体步骤如下:

步骤1:给Dialog组件注入CompanyService并封装查询逻辑

先修改CompanyUserDialogComponent.ts,注入公司服务,同时封装原来的查询逻辑,还要预留接收公司ID的属性:

import { CompanyService } from '../your-path-to-company-service'; // 替换成实际文件路径

@Component({ selector: 'jhi-company-user-dialog', templateUrl: './company-user-dialog.component.html' })
export class CompanyUserDialogComponent implements OnInit {
  companyId: number; // 存储要查询的公司ID
  constructor(
    private companyService: CompanyService, // 注入公司服务
    private userService: UserService // 别忘了原来的userService,你代码里用到了但没注入
  ) { }

  // 封装原Popup里的getComapny逻辑
  getCompany() {
    this.companyService.find(this.companyId).subscribe(res => {
      console.log(res);
      // 这里可以添加你需要的后续操作,比如更新组件内的公司数据、触发其他逻辑等
    });
  }

  save() {
    console.log(this.user)
    this.doNotMatch = null;
    this.isSaving = true;
    if (this.user.password !== this.confirmPassword) {
      this.doNotMatch = 'ERROR';
    } else if (this.user.id !== null) {
      this.userService.update(this.user).subscribe(
        (response) => {
          this.onSaveSuccess1(response);
          this.getCompany(); // 保存成功后调用查询逻辑
        }, 
        () => this.onSaveError()
      );
    } else {
      this.userService.create(this.user).subscribe(
        (response) => {
          console.log(response);
          this.onSaveSuccess1(response);
          this.getCompany(); // 保存成功后调用查询逻辑
        }, 
        () => this.onSaveError()
      );
    }
  }

  // 补充你代码里用到的onSaveSuccess1和onSaveError方法(如果还没实现)
  private onSaveSuccess1(response: any) {
    this.isSaving = false;
    // 这里可以添加保存成功后的其他逻辑,比如关闭弹窗等
  }

  private onSaveError() {
    this.isSaving = false;
  }
}

步骤2:打开Dialog时传递公司ID

修改CompanyUserPopupComponent.ts,在调用弹窗服务打开Dialog时,把路由里拿到的公司ID传递过去:

ngOnInit() {
  this.routeSub = this.route.params.subscribe((params) => {
    const companyId = params['id'];
    this.getComapny(companyId); // 保留Popup自己原有的查询调用

    if (params['login']) {
      // 根据你的弹窗服务API传递数据,这里假设支持传入额外参数
      this.userModalService.open(CompanyUserDialogComponent as Component, {
        login: params['login'],
        companyId: companyId
      });
    } else {
      this.userModalService.open(CompanyUserDialogComponent as Component, {
        companyId: companyId
      });
    }
  });
}

步骤3:在Dialog中接收传递的公司ID

最后要让Dialog拿到传递过来的公司ID,具体方式取决于你用的弹窗服务:

如果是Angular Material的MatDialog

通过MAT_DIALOG_DATA注入数据:

import { MAT_DIALOG_DATA } from '@angular/material/dialog';

@Component({ selector: 'jhi-company-user-dialog', templateUrl: './company-user-dialog.component.html' })
export class CompanyUserDialogComponent implements OnInit {
  companyId: number;

  constructor(
    private companyService: CompanyService,
    private userService: UserService,
    @Inject(MAT_DIALOG_DATA) public data: any
  ) { 
    this.companyId = data.companyId; // 从弹窗数据中提取公司ID
  }

  // ... 其他代码不变
}

如果是自定义的弹窗服务

确保服务在打开组件时能把数据赋值给Dialog实例:

// 假设你的userModalService.open方法是这样实现的
open(component: Component, data?: any) {
  const dialogRef = this.dialog.open(component);
  const dialogInstance = dialogRef.componentInstance as CompanyUserDialogComponent;
  if (data?.companyId) {
    dialogInstance.companyId = data.companyId;
  }
  return dialogRef;
}

关键思路说明

  • 不要直接跨组件调用方法:组件间通信优先用共享服务和数据传递,避免组件间强耦合。
  • 复用服务逻辑:把查询公司的核心逻辑(调用companyService.find())移到Dialog中,通过注入服务实现,避免重复代码。
  • 传递必要参数:Dialog需要知道查询哪个公司,所以必须从能拿到路由参数的Popup组件把ID传递过去。

内容的提问来源于stack exchange,提问作者wajdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:34:24