Ember.set设置模型属性后JSON.stringify无法获取值,问题何在?
问题原因与解决方案
为什么JSON.stringify(model)找不到动态添加的属性?
Ember的模型(比如DS.Model)是基于预定义属性列表工作的——只有你在模型类里用attr()声明的属性,才会被Ember的序列化系统识别并纳入序列化范围。你用Ember.set(model, 'processedTrans', 'TechMahindra')添加的是模型实例的临时属性,它并没有被注册到模型的官方属性列表中,所以默认情况下:
model.get()能拿到它,因为get方法会遍历实例的所有属性(包括临时添加的);- 但
JSON.stringify(model)或者模型自带的toJSON()方法,只会序列化那些在模型类里声明过的属性,不会包含这个临时属性。
怎么让这个属性出现在JSON字符串中?
根据你的使用场景,有几种方案可选:
方案1:在模型类中显式声明属性(推荐,适合需要长期使用的属性)
如果processedTrans是业务中需要经常用到的属性,直接在你的模型类里添加这个属性定义:
// 比如你的模型文件 app/models/your-model.js import Model, { attr } from '@ember-data/model'; export default class YourModel extends Model { // 其他已定义的属性... @attr('string') processedTrans; }
这样之后,不管是model.get()还是序列化(包括JSON.stringify或者model.toJSON()),这个属性都会被正常包含。
方案2:手动组合序列化数据(适合临时属性)
如果只是临时需要把这个属性加入JSON,可以先获取模型的标准序列化数据,再手动添加临时属性:
// 先获取模型预定义属性的序列化结果 const serializedModel = model.toJSON(); // 添加临时属性 serializedModel.processedTrans = model.get('processedTrans'); // 再转成JSON字符串 const jsonString = JSON.stringify(serializedModel);
或者用Ember的getProperties方法一次性获取需要的属性:
const data = model.getProperties('id', 'name', 'processedTrans'); // 替换成你需要的属性 const jsonString = JSON.stringify(data);
方案3:自定义序列化器(适合全局需要包含临时属性的场景)
如果你的项目中很多地方都需要把这类临时属性加入序列化,可以自定义模型的序列化器,重写serialize方法:
// app/serializers/your-model.js import JSONSerializer from '@ember-data/serializer/json'; export default class YourModelSerializer extends JSONSerializer { serialize(snapshot, options) { const json = super.serialize(snapshot, options); // 从模型实例中获取临时属性并添加到序列化结果 json.processedTrans = snapshot.record.get('processedTrans'); return json; } }
之后调用model.toJSON()时,就会自动包含这个属性了。
补充:你设置的内容属于模型的属性吗?
它属于模型实例的属性,但不属于模型类预定义的序列化属性。Ember允许你给实例动态添加任意属性,但这些属性不会自动参与模型的序列化、持久化等核心流程,除非你显式把它们加入到模型的属性定义或者序列化逻辑中。
内容的提问来源于stack exchange,提问作者user2024080
相关产品推荐
相关产品推荐

