Angular 11 : 循环依赖
Angular 11 : circular dependency
这是我在 Typescript 中的错误:
Warning: Circular dependency detected:
src\app\components\elements\modal\update-keyword-modal\update-keyword-modal.component.ts
-> src\app\components\elements\validator\unique-keyword-name-validator.ts
-> src\app\services\keyword\keyword.service.ts -> src\app\components\elements\modal\update-keyword-modal\update-keyword-modal.component.ts
我明白这个错误,但我很难解决:(
update-keyword-modal.component.ts 取决于 unique-keyword-name-validator.ts
import { UniqueKeywordNameValidator } from '../../validator/unique-keyword-name-validator';
constructor(
private formBuilder: FormBuilder,
private fileUtils: FileUtils,
private uniqueKeywordName: UniqueKeywordNameValidator,
private dialogRef: MatDialogRef<UpdateKeywordModalComponent>,
@Inject(MAT_DIALOG_DATA) data) {
this.name = data.keyword.name;
}
ngOnInit(): void {
this.updateKeywordForm = this.formBuilder.group({
keywordName: [this.name, [Validators.required], [this.uniqueKeywordName.keywordNameValidator(this.name)], ['blur']]
});
}
唯一关键字名称-validator.ts 取决于 keyword.service.ts
import { KeywordService } from "src/app/services/keyword/keyword.service";
constructor(private keywordService: KeywordService) {}
keywordNameValidator(oldname : string): AsyncValidatorFn {
return (control: AbstractControl): Observable<ValidationErrors | null> => {
return this.keywordService.checkUniqueName(control.value).pipe(
map(res => {
if (oldname == control.value) {
res = false;
}
// if res is true, keywordName exists, return true
return res ? { uniqueKeyword: true } : null;
// NB: Return null if there is no error
})
);
};
}
keyword.service.ts 取决于更新关键字-modal.component.ts
import { UpdateKeywordModalComponent } from 'src/app/components/elements/modal/update-keyword-modal/update-keyword-modal.component';
const modalDialog = this.matDialog.open(UpdateKeywordModalComponent, dialogConfig);
return modalDialog.afterClosed();
你能帮我解决这个问题吗?
这不是 angular 特定问题,而是更多应用程序设计特定问题。
如果有两个服务导致此问题,您可以在构造函数中使用 Injector
并通过它调用服务,但由于这不是问题,您可以尝试保留加载 UpdateKeywordModalComponent
的方法在另一个服务中使用模式或保留在 unique-keyword-name-validator.ts
中并在 keyword.service.ts
.
响应时使用它
这可以帮助您避免该问题。
这是我在 Typescript 中的错误:
Warning: Circular dependency detected: src\app\components\elements\modal\update-keyword-modal\update-keyword-modal.component.ts -> src\app\components\elements\validator\unique-keyword-name-validator.ts -> src\app\services\keyword\keyword.service.ts -> src\app\components\elements\modal\update-keyword-modal\update-keyword-modal.component.ts
我明白这个错误,但我很难解决:(
update-keyword-modal.component.ts 取决于 unique-keyword-name-validator.ts
import { UniqueKeywordNameValidator } from '../../validator/unique-keyword-name-validator';
constructor(
private formBuilder: FormBuilder,
private fileUtils: FileUtils,
private uniqueKeywordName: UniqueKeywordNameValidator,
private dialogRef: MatDialogRef<UpdateKeywordModalComponent>,
@Inject(MAT_DIALOG_DATA) data) {
this.name = data.keyword.name;
}
ngOnInit(): void {
this.updateKeywordForm = this.formBuilder.group({
keywordName: [this.name, [Validators.required], [this.uniqueKeywordName.keywordNameValidator(this.name)], ['blur']]
});
}
唯一关键字名称-validator.ts 取决于 keyword.service.ts
import { KeywordService } from "src/app/services/keyword/keyword.service";
constructor(private keywordService: KeywordService) {}
keywordNameValidator(oldname : string): AsyncValidatorFn {
return (control: AbstractControl): Observable<ValidationErrors | null> => {
return this.keywordService.checkUniqueName(control.value).pipe(
map(res => {
if (oldname == control.value) {
res = false;
}
// if res is true, keywordName exists, return true
return res ? { uniqueKeyword: true } : null;
// NB: Return null if there is no error
})
);
};
}
keyword.service.ts 取决于更新关键字-modal.component.ts
import { UpdateKeywordModalComponent } from 'src/app/components/elements/modal/update-keyword-modal/update-keyword-modal.component';
const modalDialog = this.matDialog.open(UpdateKeywordModalComponent, dialogConfig);
return modalDialog.afterClosed();
你能帮我解决这个问题吗?
这不是 angular 特定问题,而是更多应用程序设计特定问题。
如果有两个服务导致此问题,您可以在构造函数中使用 Injector
并通过它调用服务,但由于这不是问题,您可以尝试保留加载 UpdateKeywordModalComponent
的方法在另一个服务中使用模式或保留在 unique-keyword-name-validator.ts
中并在 keyword.service.ts
.
这可以帮助您避免该问题。