如何在同一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
相关产品推荐
相关产品推荐

