Angular:异步获取数据;我不应该强制更改检测
Angular: getting data from async; I should not have to force change detection
我经常遇到这个问题。尝试获取用户列表(来自数据库)并将其显示在
用户-admin.component.html:
<div class="col-md-2 offset-1">
<select size=20 [ngStyle]="{'width': '200px'}">
<option *ngFor="let name of userNames">{{name}}</option>
</select>
</div>
用户-admin.component.ts
userNames: string[] = [];
constructor(private fb: FormBuilder,
private authService: AuthService
) { }
ngOnInit() {
this.authService.getAllUserNames(this.userNames);
getAllUserNames 是服务中的一个函数:authService。
getAllUserNames(userNames: string[]) {
this.http.get(this.baseUrl + 'usernames').subscribe( (results: string[]) => {
userNames = results;
});
}
当页面启动 (ngOnInit) 并调用此函数时,它正确 returns 'userNames' 包含两个用户名的列表。
我只能假定 user-admin.component userNames 具有相同的列表。 (我测试了 html 以确保它会列出名称(如果它们在列表中))。
解决方案?我假设我必须强制执行 ChangeDetection,这似乎真的没有必要?
OR this.userNames 需要是一个参考变量。我认为它已经是(字符串类型列表)。我尝试创建一个仅包含 this.userName 作为唯一内容的 class,然后传递一个 'new AllUsers' class,但 AllUsers 中的列表也没有显示用户名。
想法?
提前致谢。
瑜珈
您不需要订阅服务,而是订阅组件 class。像这样,您不需要强制更改检测。只要你更新 userNames(component class 属性) 它就会自动渲染。
user-admin.component.ts
userNames: string[] = [];
constructor(private fb: FormBuilder,
private authService: AuthService
) { }
ngOnInit() {
this.authService.getAllUserNames().subscribe( (results: string[]) => {
userNames = results;
});
}
getAllUserNames(userNames: string[]) {
this.http.get(this.baseUrl + 'usernames');
}
您需要从服务中的 HTTP 请求 return observable returned 并订阅它的组件。尝试以下
用户-admin.component.ts
userNames: string[] = [];
constructor(private fb: FormBuilder, private authService: AuthService) { }
ngOnInit() {
this.authService.getAllUserNames().subscribe(
response => { this.userNames = response },
error => { // handle error }
);
}
authService
getAllUserNames(): Obserable<any> {
return this.http.get(this.baseUrl + 'usernames');
}
另一种方法是使用 async
管道,您不必在组件中订阅。但这在这种情况下并没有太大区别,因为 async
通常有助于处理内存泄漏错误。而这里 HTTP 客户端会处理内存泄漏问题,因此我们不必在组件中手动取消订阅。
但是,如果您使用的是自定义的 Observable 并希望在组件中订阅它,建议在 OnDestroy
挂钩中取消订阅。
import { Component, OnInit, OnDestroy } from '@angular/core';
export class AppComponent implements OnInit, OnDestroy {
private subscription: any;
ngOnInit() {
this.subscription = this.service.getObservable().subscribe(
value => { },
error => { }
);
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
}
我经常遇到这个问题。尝试获取用户列表(来自数据库)并将其显示在
用户-admin.component.html:
<div class="col-md-2 offset-1">
<select size=20 [ngStyle]="{'width': '200px'}">
<option *ngFor="let name of userNames">{{name}}</option>
</select>
</div>
用户-admin.component.ts
userNames: string[] = [];
constructor(private fb: FormBuilder,
private authService: AuthService
) { }
ngOnInit() {
this.authService.getAllUserNames(this.userNames);
getAllUserNames 是服务中的一个函数:authService。
getAllUserNames(userNames: string[]) {
this.http.get(this.baseUrl + 'usernames').subscribe( (results: string[]) => {
userNames = results;
});
}
当页面启动 (ngOnInit) 并调用此函数时,它正确 returns 'userNames' 包含两个用户名的列表。
我只能假定 user-admin.component userNames 具有相同的列表。 (我测试了 html 以确保它会列出名称(如果它们在列表中))。
解决方案?我假设我必须强制执行 ChangeDetection,这似乎真的没有必要?
OR this.userNames 需要是一个参考变量。我认为它已经是(字符串类型列表)。我尝试创建一个仅包含 this.userName 作为唯一内容的 class,然后传递一个 'new AllUsers' class,但 AllUsers 中的列表也没有显示用户名。
想法? 提前致谢。 瑜珈
您不需要订阅服务,而是订阅组件 class。像这样,您不需要强制更改检测。只要你更新 userNames(component class 属性) 它就会自动渲染。
user-admin.component.ts
userNames: string[] = [];
constructor(private fb: FormBuilder,
private authService: AuthService
) { }
ngOnInit() {
this.authService.getAllUserNames().subscribe( (results: string[]) => {
userNames = results;
});
}
getAllUserNames(userNames: string[]) {
this.http.get(this.baseUrl + 'usernames');
}
您需要从服务中的 HTTP 请求 return observable returned 并订阅它的组件。尝试以下
用户-admin.component.ts
userNames: string[] = [];
constructor(private fb: FormBuilder, private authService: AuthService) { }
ngOnInit() {
this.authService.getAllUserNames().subscribe(
response => { this.userNames = response },
error => { // handle error }
);
}
authService
getAllUserNames(): Obserable<any> {
return this.http.get(this.baseUrl + 'usernames');
}
另一种方法是使用 async
管道,您不必在组件中订阅。但这在这种情况下并没有太大区别,因为 async
通常有助于处理内存泄漏错误。而这里 HTTP 客户端会处理内存泄漏问题,因此我们不必在组件中手动取消订阅。
但是,如果您使用的是自定义的 Observable 并希望在组件中订阅它,建议在 OnDestroy
挂钩中取消订阅。
import { Component, OnInit, OnDestroy } from '@angular/core';
export class AppComponent implements OnInit, OnDestroy {
private subscription: any;
ngOnInit() {
this.subscription = this.service.getObservable().subscribe(
value => { },
error => { }
);
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
}