Ember:自定义JSONAPISerializer

时间:2016-11-13 03:42:10

标签: javascript json serialization ember.js

在数据存储区中创建新记录后,我无法将数据保存回API。

// routes/application.js

import Ember from 'ember';

export default Ember.Route.extend({
  model(){
    return this.store.findAll('user');
  },
  actions: {
    test(name){
      this.store.createRecord('user', {
        username: name,
        email: 'email@email.com',
        is_staff: false
      }).save();
    }
  }
});

REST API期待此请求:

{
    "data": {
        "type": "User",
        "id": null,
        "attributes": {
            "username": "bill",
            "email": "email@email.com",
            "is_staff": false
        }
    }
}

Ember-data正在发送:

{
    data: 
    {
        attributes: 
        {
            username: "bill", 
            email: "email@email.com", 
            is-staff: false
        }, 
    type: "users"
    }
}

以下是我对自定义序列化程序的看法,但是Ember没有看到它。我这样做了吗?

import DS from 'ember-data';

export default DS.JSONAPISerializer.extend({

  normalizeCreateRecordResponse(store, type, payload){
    return {
      data: {
        type: 'User',
        id: null,
        attributes: {
          username: payload.username,
          email: payload.email,
          is_staff: payload.is_staff
        }
      }
    }
  }

});

另外,为了确保API正常工作,我可以通过jQuery.post()发送数据:

// routes/application.js

    import Ember from 'ember';

    export default Ember.Route.extend({
      model(){
        return this.store.findAll('user');
      },
      actions: {
        test(name){
          Ember.$.post('http://localhost:8000/api/users/', {
            username: name,
            email: 'email@email.com',
            is_staff: false
          });
      }
    });

1 个答案:

答案 0 :(得分:1)

您正在尝试normalizeCreateRecordResponse方法,但这适用于从创建记录POST调用中从服务器获取数据的时间。

如果要修改发送到服务器所需的数据:

https://guides.emberjs.com/v2.0.0/models/customizing-serializers/#toc_customizing-serializers

使用serialize方法(还有其他序列化方法可以实现更细粒度的控制......但是这个方法非常简单,可以根据需要进行测试)

此链接说明了这一点。如果你无法从那里弄明白,请告诉我。