Angular strictPropertyInitialization-在哪里初始化成员?
在组件初始化期间,我希望检索一些用户信息。 现在,在Angular strict模式下,我不确定在哪里加载这些数据 我可以想出3个选择。但是哪一个是正确的呢?或者还有其他可能性吗 #1在该选项中,服务方法将在初始化userInfo时直接调用Angular strictPropertyInitialization-在哪里初始化成员?,angular,typescript,Angular,Typescript,在组件初始化期间,我希望检索一些用户信息。 现在,在Angular strict模式下,我不确定在哪里加载这些数据 我可以想出3个选择。但是哪一个是正确的呢?或者还有其他可能性吗 #1在该选项中,服务方法将在初始化userInfo时直接调用 export class NavComponent implements OnInit { public userInfo$: Observable<LoggedInUser> = this.sessionService.getUserInf
export class NavComponent implements OnInit {
public userInfo$: Observable<LoggedInUser> = this.sessionService.getUserInformation();
constructor(private sessionService: SessionService) {}
ngOnInit(): void {}
}
导出类NavComponent实现OnInit{
public userInfo$:Observable=this.sessionService.getUserInformation();
构造函数(私有sessionService:sessionService){}
ngOnInit():void{}
}
#2在我看来,最好将其输入构造函数,如下所示:
export class NavComponent implements OnInit {
public isMobileMenuCollapsed = true;
public userInfo$: Observable<LoggedInUser>;
constructor(private sessionService: SessionService) {
this.userInfo$ = this.sessionService.getUserInformation();
}
ngOnInit(): void {}
}
导出类NavComponent实现OnInit{
public ismobilelemenu=true;
public userInfo$:可见;
构造函数(专用会话服务:会话服务){
this.userInfo$=this.sessionService.getUserInformation();
}
ngOnInit():void{}
}
#3,而不是构造函数。但是对于这个解决方案,我还需要明确的赋值断言:
export class NavComponent implements OnInit {
public isMobileMenuCollapsed = true;
public userInfo$!: Observable<LoggedInUser>;
constructor(private sessionService: SessionService) {
}
ngOnInit(): void {
this.userInfo$ = this.sessionService.getUserInformation();
}
导出类NavComponent实现OnInit{
public ismobilelemenu=true;
public userInfo$!:可见;
构造函数(专用会话服务:会话服务){
}
ngOnInit():void{
this.userInfo$=this.sessionService.getUserInformation();
}
}
我应该在代码中使用以下哪种可能性?您真正的问题是什么?我猜这是关于使用异步管道时模板中的类型不匹配 您需要知道异步管道可能返回
null
不匹配不是因为您可以观察到,而是因为管道的结果
如何修复它
在元素或更高级别的元素上引入*ngIf并使用结果。由于*ngIf,数据类型不能再包含null
TL;DR使用选项1
哪一个是正确的?
您是否仅在HTML模板中使用userInfo$
?
那么这三种选择在理论上都应该有效
为什么?
因为模板代码在ngOnInit
之后运行,所以userInfo$
应该在这三个选项中都已初始化
哪一个更好?
#1和#2本质上是相同的,在这两种情况下,userInfo$
正在构造函数中初始化。我更喜欢#1,因为它消除了代码中的冗余
#3稍有不同,因为初始化没有在构造函数中发生。因此,如果您在组件内部使用
userInfo$
(例如,在ngOnChanges
中,它在ngOnInit
之前被调用),这可能会引入一些微妙的错误。回答得很好。是否存在1和2不起作用的情况?例如,在复杂的情况下,一些变量在构造函数调用后初始化?我可以想象@ViewChilds,它只能在ngOnInit或之后安全使用。对于这种情况,3是正确的方法吗?是的,在这种情况下,userInfo$将只在html模板中使用是的,完全正确。对于值在构造函数中不可用的情况,必须在值可用时进行初始化(ngOnInit
,ngAfterViewInit
,ngAfterContentInit
)。即使在这些情况下,另一种选择是定义主题
,然后根据主题定义可观察的userInfo$
。我没有任何问题。我的异步管道按预期工作(正如您在上一句中提到的)。我的问题只是,这是正确的方法,因为在官方的angular文档/教程中,它没有得到适当的描述。