Ember中DS.Model获取服务器数据后记录无内容问题排查
问题分析与解决方案
你的问题核心在于服务器返回的数据格式不符合Ember Data默认序列化器的解析规则,导致Ember虽然创建了记录,但无法正确映射属性值。
为什么会出现这个问题?
Ember Data默认使用JSONSerializer,它对findAll请求的返回格式有明确要求:
必须用复数形式的模型名作为根键,包裹住返回的记录数组
举个例子,你的模型是product,那么默认期望的返回格式应该是这样的:
{ "products": [ {"id": 1, "name": "示例商品1", "price": 99}, {"id": 2, "name": "示例商品2", "price": 199}, {"id": 3, "name": "示例商品3", "price": 299} ] }
而你当前服务器返回的是裸数组(没有根键包裹),这就导致默认序列化器无法识别要解析的数据,最终创建了空的记录。
两种可行的解决方案
方案一:修改服务器返回格式(推荐)
如果你有权限调整服务器接口,直接把返回数据包裹到复数模型名的根键下,就能适配Ember Data的默认行为,不需要额外修改前端代码。
方案二:自定义序列化器适配现有格式
如果无法修改服务器,你可以给product模型自定义一个序列化器,让它能解析裸数组:
- 先通过Ember CLI生成序列化器文件:
ember generate serializer product
- 打开
serializers/product.js,重写normalizeFindAllResponse方法:
import JSONSerializer from '@ember-data/serializer/json'; export default class ProductSerializer extends JSONSerializer { normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) { // 把服务器返回的裸数组包裹到根键中 payload = { products: payload }; // 调用父类方法完成后续的标准化处理 return super.normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType); } }
这样Ember Data就能正确识别并解析服务器返回的数据,把属性值映射到对应的记录上了。
内容的提问来源于stack exchange,提问作者Alexandr Rypun
相关产品推荐
相关产品推荐

