Angular13中TypeScript对象转字符串赋值question字段返回null如何解决
问题根因
赋值得到null的核心原因是Angular接口请求的异步时序问题:
你调用的service方法默认返回的是RxJS Observable可观察对象,执行this.variable = this.service('id', this.parentcontrol)这行代码时,仅仅是发起了请求,并没有拿到接口实际返回的JSON数据。这时候你同步读取variable.title给question字段赋值,拿到的只能是null,和你用不用String()做类型转换没有关系。
写死字符串能正常运行,是因为静态字符串是同步初始化的,不存在等待接口响应的时间差。
修复方案
- 修正接口调用逻辑:不要直接把service方法返回的Observable对象赋值给业务变量,要通过
subscribe订阅接口响应,在拿到真实返回数据的回调函数里再完成question字段的赋值
// 先初始化手风琴组件的条目结构,给初始空值 accordionItem: {question: string, answer: string, opened: boolean} = { question: '', answer: '', opened: false }; // 正确发起接口请求 this.service('id', this.parentcontrol).subscribe({ next: (responseData) => { // 该回调触发时才真正拿到接口返回的JSON数据 this.variable = responseData; // 此时赋值可以正常拿到title值 this.accordionItem.question = responseData.title; }, error: (err) => { console.error('接口请求异常', err); } });
- 模板侧增加空值兼容:避免接口返回前渲染报错,使用Angular安全导航操作符处理空值场景
{{ variable?.title }}
接口返回完成赋值后,Angular的变更检测会自动更新手风琴组件的渲染内容,不需要额外手动触发视图刷新。
避坑说明
- 不要在类属性初始化的位置直接读取异步变量赋值,类属性初始化的执行时机远早于接口响应返回的时机
- 不需要额外用
String()做强制类型转换,只要接口返回的title字段是字符串类型,直接赋值即可,类型转换解决不了异步时序导致的空值问题
内容的提问来源于stack exchange,提问作者Ahmadreza Shamimi
相关产品推荐
相关产品推荐

