【发布时间】:2017-01-21 03:16:08
【问题描述】:
所以我有一个带有 @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 来创建此组件的多个元素:
<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 关于记录SomeComponent 的ngOnDestroy 的评论,我发现它在发射之前就被销毁了。
实际上,SomeService.updateBackend 结束后它做的第一件事就是销毁该组件的所有实例并重新创建它们!
这就是让观察者发生变化的原因!为什么会这样?
【问题讨论】:
-
我建议将标题更改为反映问题的内容。
this根本没有改变。它是同一个对象。在 ngFor 中输出事件监听器。 -
@GünterZöchbauer 好的,我会尝试实施您的建议并在我完成后立即更新
-
当 observable 替换数组
*ngFor迭代时,*ngFor必须更新视图以反映模型中的更改。如果您只添加或删除项目,那么*ngFor也只是添加删除 DOM 中的相关元素。 -
@GünterZöchbauer 由于我的
doSomething()实际上是从后端重新获取数据,它正在替换绑定的dataCollection并导致ngFor完全重新初始化 -
抱歉,我刚刚看到您在问题中所做的更改。您的答案已经包含:D
标签: javascript angular components this ngfor