Ember模型访问belongsTo关联属性返回undefined问题及解决
解决Ember.js关联模型计算属性返回undefined的问题
问题回顾
你在Person模型中通过address_fk: DS.belongsTo('address')关联了Address模型,想要编写计算属性拼接包含邮编的完整地址,但调用this.get('address_fk.zip_code')获取邮编时返回了undefined。
问题根源
出现这个问题主要有两个核心原因:
- Ember的计算属性依赖追踪需要明确指定嵌套的关联属性,如果仅把
address_fk作为依赖项,当关联的Address模型异步加载完成或属性更新时,计算属性不会自动触发重新计算。 belongsTo关联默认是异步加载的,在关联数据还未加载完成时,直接访问嵌套属性自然会得到undefined。
正确的解决写法
你需要在计算属性的依赖列表中明确指定要监听的关联模型属性,同时增加空值判断避免报错。以下分两种写法供参考:
新版Ember(使用装饰器语法)
import Model, { attr, belongsTo, computed } from '@ember-data/model'; export default class PersonModel extends Model { @belongsTo('address') address_fk; // 注意:如果你的属性名是adresse_fk,请对应修改 @computed('address_fk.zip_code', 'address_fk.building') get fullAddress() { const address = this.address_fk; // 先判断关联是否加载完成,避免空值报错 if (!address) return ''; // 拼接完整地址 return `${address.zip_code} ${address.building}`; } }
旧版Ember(经典写法)
import DS from 'ember-data'; export default DS.Model.extend({ address_fk: DS.belongsTo('address'), fullAddress: DS.computed('address_fk.zip_code', 'address_fk.building', function() { let address = this.get('address_fk'); if (!address) return ''; return `${this.get('address_fk.zip_code')} ${this.get('address_fk.building')}`; }) });
额外提示
如果你的关联属性名实际是adresse_fk(比如你代码片段里写的adresse: computed('adresse_fk'...)),记得把依赖键中的address_fk统一改成adresse_fk,保持命名一致,否则依然会出现属性获取不到的问题。
内容的提问来源于stack exchange,提问作者El Poisen
相关产品推荐
相关产品推荐

