如何在Ember Model中访问嵌套JSON,实现belongsTo关联
嘿,我懂你现在的困扰——你想在Ember Data模型里基于嵌套在content里的image_id建立belongsTo关联,虽然模板里能正常获取数据,但模型内部没法直接把这个嵌套ID和关联绑定起来对吧?我来给你两个可行的解决方案:
方案1:自定义序列化器提取嵌套外键(推荐)
这种方式更符合Ember Data的规范,让框架自动处理关联逻辑。
首先,修改你的模型,添加belongsTo关联:
import DS from 'ember-data'; const { attr, belongsTo } = DS; export default DS.Model.extend({ content: attr(), title: attr('string'), // 添加image关联,async根据你的需求设置(true为异步加载) image: belongsTo('image', { async: true }) });
接下来,创建对应模型的序列化器(比如你的模型叫post,就创建app/serializers/post.js),重写normalizeResponse方法把嵌套的image_id提取到顶层,让Ember Data能识别:
import DS from 'ember-data'; export default DS.JSONAPISerializer.extend({ normalizeResponse(store, primaryModelClass, payload, id, requestType) { // 从content里提取image_id到payload顶层 if (payload.content && payload.content.image_id) { payload.image_id = payload.content.image_id; } // 调用父类方法完成后续序列化 return this._super(store, primaryModelClass, payload, id, requestType); } });
如果你用的是RESTSerializer,逻辑完全一致,只是序列化器继承的类换成DS.RESTSerializer就行。
现在你就能在模型内部通过this.get('image.id')(当关联加载完成后)获取到对应的图片ID,或者直接通过this.get('image')拿到关联的图片模型实例。
方案2:用计算属性作为关联外键
如果不想自定义序列化器,也可以在模型里通过计算属性暴露嵌套的image_id,再绑定到关联上:
import DS from 'ember-data'; const { attr, belongsTo, computed } = DS; export default DS.Model.extend({ content: attr(), title: attr('string'), // 定义计算属性,返回content里的image_id imageId: computed('content.image_id', function() { return this.get('content.image_id'); }), // 关联指定使用imageId作为外键 image: belongsTo('image', { foreignKey: 'imageId' }) });
这种方式的好处是不用额外写序列化器,但如果后续需要把数据序列化回后端,可能还要重写序列化方法,把image_id放回content里。
不管用哪种方案,你都能在模型内部轻松获取到image_id,同时建立起正确的belongsTo关联啦。
内容的提问来源于stack exchange,提问作者Chris Johnson
相关产品推荐
相关产品推荐

