Ember.js重写JSONAPISerializer的normalizeResponse时解析primaryModelClass参数
在Ember.js中针对特定模型重写JSONAPISerializer的默认行为
我之前也遇到过类似的问题——直接打印primaryModelClass时会显示“unknown mixin”,但其实它包含了识别模型类型的关键属性,不用慌,咱们可以用以下几种方式来判断模型类型,实现差异化处理:
方式1:利用modelName属性直接识别模型
primaryModelClass作为模型的类实例,自带modelName属性,这个属性的值就是你定义模型时的名称(比如app/models/post.js对应的modelName就是'post')。你可以在重写的方法里直接通过这个属性判断,然后编写自定义逻辑:
import JSONAPISerializer from '@ember-data/serializer/json-api'; export default class ApplicationSerializer extends JSONAPISerializer { normalizeResponse(store, primaryModelClass, payload, id, requestType) { // 获取当前处理的模型名称 const modelName = primaryModelClass.modelName; // 针对Post模型做自定义处理 if (modelName === 'post') { payload = this.handlePostPayload(payload); } // 针对User模型做自定义处理 else if (modelName === 'user') { payload = this.handleUserPayload(payload); } // 最后调用父类方法完成默认序列化流程 return super.normalizeResponse(store, primaryModelClass, payload, id, requestType); } handlePostPayload(payload) { // 这里写Post模型的专属逻辑,比如修改字段结构 if (payload.data?.attributes) { // 举个例子:把original_title字段重命名为title payload.data.attributes.title = payload.data.attributes.original_title; delete payload.data.attributes.original_title; } return payload; } handleUserPayload(payload) { // User模型的专属处理逻辑 return payload; } }
方式2:使用is方法判断模型类
如果你更习惯用类实例的方式判断,可以通过store.modelFor()获取目标模型的类,再用primaryModelClass.is()方法来验证:
normalizeResponse(store, primaryModelClass, payload, id, requestType) { const PostModel = store.modelFor('post'); if (primaryModelClass.is(PostModel)) { // 处理Post模型逻辑 } return super.normalizeResponse(...arguments); }
更优雅的方案:为单个模型创建独立序列化器
其实Ember Data支持为每个模型单独定义序列化器,这种方式比在全局序列化器里做判断更清晰,也更符合Ember的约定。比如你想给Post模型自定义序列化逻辑,只需要创建app/serializers/post.js:
import JSONAPISerializer from '@ember-data/serializer/json-api'; export default class PostSerializer extends JSONAPISerializer { normalizeResponse(store, primaryModelClass, payload, id, requestType) { // 这里的逻辑只会作用于Post模型 payload = this.handlePostPayload(payload); return super.normalizeResponse(store, primaryModelClass, payload, id, requestType); } handlePostPayload(payload) { // 自定义Post模型的序列化逻辑 return payload; } }
这样Ember Data会自动为Post模型使用这个序列化器,不需要手动判断模型类型,代码结构更整洁,维护起来也更方便。
内容的提问来源于stack exchange,提问作者Vilhelm H.
相关产品推荐
相关产品推荐

