@Output
したがって、次のように、送信時にトリガーされるイベントを持つ from のこのコンポーネントがあります。
@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
は、本来あるべき 1 つのオブザーバーを含む配列です。
this.onSubmit.emit()
が呼び出されるコールバック メソッドに到達するとすぐに、this.onSubmit.observers
はゼロのオブザーバーを含む配列になります。
2 つの非常に奇妙な動作が発生しています。
- バックエンドを更新する実際の呼び出しを削除する
SomeService.updateBackend
と、完全に正常に動作し、observers
まだ 1 つのオブザーバーを含む配列です! - バックエンドへの実際の呼び出しを保持するが、使用せずに
ngFor
1 つだけを表示する<some-element>
場合も、完全に正常に動作し、1 つのオブザーバーをthis.onSubmit.observers
コールバック スコープ内に保持します!
私は何が間違っているのですか?
前もって感謝します!
アップデート:
のログ記録に関する @StevenLuke のコメントのおかげで、出力前に破棄されていることngOnDestroy
がSomeComponent
わかりました。
実際、終了時に最初に行うことはSomeService.updateBackend
、このコンポーネントのすべてのインスタンスを破棄して再作成することです!
これがオブザーバーを変えるものです!なぜそれが起こるのでしょうか?