参数传递仅在HTML中生效,TS文件读取属性返回undefined是什么原因?
问题原因
1. 异步逻辑导致的执行顺序差异
你代码中用到的subscribe是RxJS的异步订阅逻辑,实际执行顺序如下:
- 首先完成路由参数的订阅注册,注册操作是同步的,但回调函数不会立刻执行,代码会直接向下运行
- 同步执行
console.log(this.zType.personentypId),此时zService.getTypeId发起的HTTP请求还没有收到响应,对应的赋值回调还未触发,zType还是你初始化的空数组,自然读取不到personentypId属性,输出undefined - 等HTTP请求收到服务端响应后,才会执行subscribe内的回调函数,给
zType赋值为接口返回的完整数据
2. 模板可以正常显示的原因
Angular内置了自动变更检测机制,当异步回调(HTTP请求回调、定时器回调、事件回调等)执行完成后,会自动触发全局变更检测,重新计算组件模板中所有绑定的表达式值。此时zType已经被赋值为接口返回的完整数据,所以可以正确读取到personentypId渲染到页面上。
优化建议
- 不要使用嵌套subscribe写法,容易产生回调地狱,可以用RxJS的
switchMap操作符改写异步流,同时要读取zType属性的逻辑必须放在异步回调内部:
this.route.params.pipe( switchMap(params => this.zService.getTypeId(params['id'])) ).subscribe(data => { this.zType = data; console.log(this.zType.personentypId) // 此处可以正常输出值 })
- 初始化
zType时可以设置初始值为null,模板绑定处用可选链语法{{zType?.personentypId}},避免异步返回前偶发的模板报错。
内容的提问来源于stack exchange,提问作者ChopperChupss
相关产品推荐
相关产品推荐

