所以我有一个 from 的这个组件,其中包含一个@Output
在提交时触发的事件,如下所示:
@Component({
selector: 'some-component',
templateUrl: './SomeComponent.html'
})
export class SomeComponent{
@Input() data: any;
@Output() onSubmit: EventEmitter<void> = new EventEmitter<void>();
constructor(private someService: SomeService) {}
submitForm(): void{
this.someService.updateBackend(this.data, ()=>{
this.onSubmit.emit();
});
}
}
我正在使用一个ngFor
来创建这个 Component 的多个元素:
<template let-data ngFor [ngForOf]="dataCollection">
<some-component [data]="data" (onSubmit)="doSomthing()"></some-component>
</template>
最后缺少的部分是提交时使用的服务:
@Injectable()
export class SomeService{
constructor() {}
updateBackend(data: any, callback: () => void): void{
/*
* updating the backend
*/.then((result) => {
const { errors, data } = result;
if (data) {
callback();
}
})
}
}
在submitForm()
函数的开头,this.onSubmit.observers
是一个包含一个观察者的数组,就像它应该的那样。
一旦它到达回调方法,在哪里this.onSubmit.emit()
被调用,它this.onSubmit.observers
就是一个包含零观察者的数组。
我正在经历两种非常奇怪的行为:
- 如果我删除了更新后端的实际调用,
SomeService.updateBackend
它工作得很好,而且observers
仍然是一个包含一个观察者的数组! - 如果我保持对后端的实际调用但不使用
ngFor
和只显示一个<some-element>
,它也可以正常工作,将一个观察者保持this.onSubmit.observers
在回调范围内!
知道我在做什么错吗?
提前致谢!
更新:
感谢@StevenLuke 关于记录的评论ngOnDestroy
,SomeComponent
我发现它在发射之前就被销毁了。
实际上,完成后它做的第一件事SomeService.updateBackend
就是销毁该组件的所有实例并重新创建它们!
这就是让观察者发生变化的原因!为什么会这样?