使用 Observable 取数据时,需要使用 detector.detectChanges Angular v6+
When fetching data with Observable, need to use detector.detectChanges Angular v6+
我的 angular 项目中有一个奇怪的错误。当我使用模拟 API 从本地数据获取数据时,一切正常,但是当我切换到在线 API 并使用 Observable
订阅方法获取数据时,数据不会更新我的 angular 模板视图。它只会在我调用 detector.detectChanges()
方法时更新。
简而言之, 不知何故,当我使用在线 API 时,双向数据绑定仅在我调用 detectChanges
.[=26= 时有效]
例如想象下面的场景:
data = [some data here...]
getData(): Observable<any> {
return of(this.data);
}
当我在 .ts
文件中调用此方法并使用它获取数据时,angular 模板将自动更新。但是当我切换到下面的代码时:
getData(): Observable<any> {
let url = `${this.API_URL}/fetchData/`;
return this.http.get(url);
}
并在我的 angular .ts
文件中获取数据,如下所示:
this.myService.getData().subscribe(result => {
this.myData = result;
// this.detector.detectChanges();
})
myData
变量不会在 angular 模板中更新,除非我取消注释 // this.detector.detectChanges()
方法。
并且 detectChanges
是从 angular 的以下库中导入的:
private detector: ChangeDetectorRef,
谁能帮我克服这个错误?这真的很烦人,我的代码现在在任何需要双向数据绑定的代码之后到处都有很多 detectChanges
!
提前致谢
更新
我的.html 文件
<table class="table table-bordered table-striped table-responsive"
style="display: inline-table;">
<thead>
<tr style="left: 0;">
<th><span>test</span></th>
</tr>
</thead>
<tbody>
<tr style="left: 0;" *ngFor="let d of myData">
<td>{{d.test}}</td>
</tr>
</tbody>
</table>
与我不喜欢在 HTML 中执行异步的评论不同,我按照您在上面编码的方式进行操作。我的问题是您在组件上的 ChangeDetectionStrategy
设置是什么。其中一些不会自动通知更改并更新 UI(这可以解释您的问题)。
这是因为,在模板的 app.component.ts
中,它使用 changeDetectionStrategy.onPush
,所以基本上每当 angular 上下文中发生任何事情时,我应该使用像 detector.detectChanges()
这样的命令。
只需使用 changeDetectionStrategy.Default
一切都会正常,并且 angular 双向绑定将正常工作。
我的 angular 项目中有一个奇怪的错误。当我使用模拟 API 从本地数据获取数据时,一切正常,但是当我切换到在线 API 并使用 Observable
订阅方法获取数据时,数据不会更新我的 angular 模板视图。它只会在我调用 detector.detectChanges()
方法时更新。
简而言之, 不知何故,当我使用在线 API 时,双向数据绑定仅在我调用 detectChanges
.[=26= 时有效]
例如想象下面的场景:
data = [some data here...]
getData(): Observable<any> {
return of(this.data);
}
当我在 .ts
文件中调用此方法并使用它获取数据时,angular 模板将自动更新。但是当我切换到下面的代码时:
getData(): Observable<any> {
let url = `${this.API_URL}/fetchData/`;
return this.http.get(url);
}
并在我的 angular .ts
文件中获取数据,如下所示:
this.myService.getData().subscribe(result => {
this.myData = result;
// this.detector.detectChanges();
})
myData
变量不会在 angular 模板中更新,除非我取消注释 // this.detector.detectChanges()
方法。
并且 detectChanges
是从 angular 的以下库中导入的:
private detector: ChangeDetectorRef,
谁能帮我克服这个错误?这真的很烦人,我的代码现在在任何需要双向数据绑定的代码之后到处都有很多 detectChanges
!
提前致谢
更新
我的.html 文件
<table class="table table-bordered table-striped table-responsive"
style="display: inline-table;">
<thead>
<tr style="left: 0;">
<th><span>test</span></th>
</tr>
</thead>
<tbody>
<tr style="left: 0;" *ngFor="let d of myData">
<td>{{d.test}}</td>
</tr>
</tbody>
</table>
与我不喜欢在 HTML 中执行异步的评论不同,我按照您在上面编码的方式进行操作。我的问题是您在组件上的 ChangeDetectionStrategy
设置是什么。其中一些不会自动通知更改并更新 UI(这可以解释您的问题)。
这是因为,在模板的 app.component.ts
中,它使用 changeDetectionStrategy.onPush
,所以基本上每当 angular 上下文中发生任何事情时,我应该使用像 detector.detectChanges()
这样的命令。
只需使用 changeDetectionStrategy.Default
一切都会正常,并且 angular 双向绑定将正常工作。