当数据可用时,Angular2 组件不会更新
Angular2 component doesn't update when data becomes available
我有一个组件,其属性绑定到数据 属性。
@Component({
encapsulation: ViewEncapsulation.None,
selector: 'animal-detail-main',
styleUrls: ['animal-detail-main.component.scss'],
template: `
<div>
{{data | json}}
</div>
`
})
export class DetailMain {
data: any;
private dataSvc: MainService;
constructor(
@Inject(MainService) dataSvc: MainService,
) {
this.dataSvc = dataSvc;
}
ngOnInit() {
var fetchedData: any;
this.dataSvc.currentID$
.subscribe(
currentID => {
currentID = currentID;
this.dataSvc
.getDetail(currentID)
.map(response => response.json())
.subscribe (
data => {fetchedData = data[0]},
err => console.log('Error',err),
() => {
console.log('fetchedData',fetchedData);
setTimeout(() => {
this.data = fetchedData;
console.log("this.data",this.data);
}, 2000);
}
);
});
}
}
基本上 currentID$ 服务持有当前对象的 ID,因此它被取回 currentID,然后 currentID 被传递到 getDetail 服务以 return 该 ID 的整个对象。
如果没有 setTimeout,函数 return 会延迟对象数据,并且它永远不会分配给 this.data。
使用 setTimeout,在 this.data 之后的 console.log 被分配 fetchData returned 对象正确记录 returned 对象,但视图永远不会更新数据未显示在组件中。
我原以为组件会在数据可用后自动神奇地刷新,但事实并非如此,而且我不知道如何触发视图更新。
我认为您可能想在此处使用 flatMap
来链接请求,因为第二个请求依赖于您服务中的 Observable。编辑。如果你的 id 是 BehaviorSubject
.
constructor(private dataSvc: MainService) { }
data: any = {}; // if it's an object
ngOnInit() {
this.dataSvc.currentID$
.flatMap(currentId => this.dataSvc.getDetail(currentId))
.map(res => res.json()) // could do the mapping in the service
.subscribe(data => {
this.data = data[0];
});
}
关于视图不更新,对此不能完全确定....尝试上述解决方案,如果模板未更新,您可以尝试使用 ChangeDetectorRef
手动触发更改检测,但是我真的不明白为什么不会发生变化检测。但这些事情似乎有时会发生:)
我有一个组件,其属性绑定到数据 属性。
@Component({
encapsulation: ViewEncapsulation.None,
selector: 'animal-detail-main',
styleUrls: ['animal-detail-main.component.scss'],
template: `
<div>
{{data | json}}
</div>
`
})
export class DetailMain {
data: any;
private dataSvc: MainService;
constructor(
@Inject(MainService) dataSvc: MainService,
) {
this.dataSvc = dataSvc;
}
ngOnInit() {
var fetchedData: any;
this.dataSvc.currentID$
.subscribe(
currentID => {
currentID = currentID;
this.dataSvc
.getDetail(currentID)
.map(response => response.json())
.subscribe (
data => {fetchedData = data[0]},
err => console.log('Error',err),
() => {
console.log('fetchedData',fetchedData);
setTimeout(() => {
this.data = fetchedData;
console.log("this.data",this.data);
}, 2000);
}
);
});
}
}
基本上 currentID$ 服务持有当前对象的 ID,因此它被取回 currentID,然后 currentID 被传递到 getDetail 服务以 return 该 ID 的整个对象。
如果没有 setTimeout,函数 return 会延迟对象数据,并且它永远不会分配给 this.data。
使用 setTimeout,在 this.data 之后的 console.log 被分配 fetchData returned 对象正确记录 returned 对象,但视图永远不会更新数据未显示在组件中。
我原以为组件会在数据可用后自动神奇地刷新,但事实并非如此,而且我不知道如何触发视图更新。
我认为您可能想在此处使用 flatMap
来链接请求,因为第二个请求依赖于您服务中的 Observable。编辑。如果你的 id 是 BehaviorSubject
.
constructor(private dataSvc: MainService) { }
data: any = {}; // if it's an object
ngOnInit() {
this.dataSvc.currentID$
.flatMap(currentId => this.dataSvc.getDetail(currentId))
.map(res => res.json()) // could do the mapping in the service
.subscribe(data => {
this.data = data[0];
});
}
关于视图不更新,对此不能完全确定....尝试上述解决方案,如果模板未更新,您可以尝试使用 ChangeDetectorRef
手动触发更改检测,但是我真的不明白为什么不会发生变化检测。但这些事情似乎有时会发生:)