【发布时间】:2019-09-14 03:44:50
【问题描述】:
我有以下组件和服务:
组件
@Component({
selector: 'app-root',
template: '{{user.name}}',
styleUrls: ['./app.component.scss']
})
export class AppComponent {
user: User;
constructor(private userService: UserService) {
this.userService.get().subscribe(user => {
this.user = user;
});
}
}
服务
@Injectable()
export class UserService {
constructor(private http: HttpClient) {
}
get(): Observable<User> {
return this.http.get<User>('http://www.mocky.io/v2/5cc0af9a310000440a0364b6');
}
}
用户
export class User {
constructor(
public name: string
) {
}
}
如您所见,我只是想打印用户名。它可以工作,但在打印值之前,我多次收到Cannot read property 'name' of undefined 错误。
我知道原因——我异步加载用户,但是如何处理呢?
我找到了保险箱操作员:
{{user?.name}}
而且它有效。但在我的实际项目中,这种方法并不适用于任何地方。
我也尝试使用 ngIf:
<div *ngIf="user">
{{user.name}}
</div>
但这会破坏我应用程序的另一部分。
有没有办法在 HTTP 调用之后渲染组件 ,这样我就不必使用 Safe Operator 或 ngIf?如果没有,那么您使用什么方法?你如何处理这个问题?
【问题讨论】:
-
这是处理您的“问题”的两种常用方法。我不明白为什么他们不为你工作。为什么不能使用安全导航运算符?为什么
*ngIf="user"会“破坏”您的应用程序的一部分?专注于这些问题并修复您的应用,而不是试图找到一些您认为可行的灵丹妙药,因为没有。 -
附带说明,您不应在构造函数中实现任何逻辑。改为实现
OnInit接口并在那里进行调用(例如从服务中获取用户的调用)。 -
你应该在
ngOnInit方法中调用服务
标签: angular