【问题标题】:Emberjs - mapping JSON to model fieldsEmberjs - 将 JSON 映射到模型字段
【发布时间】:2014-02-26 21:31:05
【问题描述】:

我的客户端 API 以以下格式返回 JSON:

{
    "Result": [
        {
            "member": {
                "id": 1,
                "name": "Mark Smith",
                "email_address": "name@email.com",
                "member_type": [
                    "Premium"
                ],
                "privileges": [
                    "MEMBER"
                ]
            },
            "activites": {
                "ActivityId": "15",
                "ActivityName": "Tennie"
            }
        }
    ],
    "ResultCount": 1 
}

我需要映射到我的 Ember 应用模型:

App.Member = DS.Model.extend({                                                                             
  memberid:             DS.attr('number'),
  membername:          DS.attr('string'),
  memberemail:        DS.attr('string'),
  membertype:          DS.attr('string'),
  memberprivileges:         DS.attr('number'),
  activityID:           DS.attr('number')
});                                                                                                          


App.MemberSerializer = DS.RESTSerializer.extend({                                                                  
extractArray: function(store, type, payload, id, requestType){         
...

我试图实现一个序列化器来映射 json 和应用程序模型之间的字段,但不确定如何使用 extractArray 来实现,因为我找不到任何关于如何做到这一点的教程/示例,所以有人可以请根据我的客户端 JSON 结构,为我提供如何执行此操作的示例?

我根据 James 的回复做的补充:

App.ArrayTransform = DS.Transform.extend({
  deserialize: function (serialized) {
    return (Ember.typeOf(serialized) == "array")
      ? serialized
      : []
  },

  serialize: function (deserialized) {
    var type = Ember.typeOf(deserialized)
    if (type == 'array') {
      return deserialized
    } else if (type == 'string') {
      return deserialized.split(',').map(function (item) {
        return jQuery.trim(item)
      });
    } else {
      return []
    }
  }
})


App.register("transform:array", DS.ArrayTransform);

App.Member = DS.Model.extend({                                                                             
    cont : DS.attr('array')    
});

【问题讨论】:

    标签: json ember.js


    【解决方案1】:

    您需要为数组制作和使用自己的 DS.Model 对象

    /**
     * Configure a transform for DS.Model Arrays
     * DS.attr('array')
     */
    App.ArrayTransform = DS.Transform.extend({
      deserialize: function (serialized) {
        return (Ember.typeOf(serialized) == "array")
          ? serialized
          : []
      },
    
      serialize: function (deserialized) {
        var type = Ember.typeOf(deserialized)
        if (type == 'array') {
          return deserialized
        } else if (type == 'string') {
          return deserialized.split(',').map(function (item) {
            return jQuery.trim(item)
          });
        } else {
          return []
        }
      }
    })
    

    【讨论】:

    • 感谢詹姆斯的回答,除了我发现的一些推荐注册转换的参考资料之外,我已经根据您的回答更新了我的问题,但现在出现错误:TypeError:尝试注册未知工厂:transform:array....如果我删除转换注册,我会收到另一个错误:“加载路线时出错:未定义”所以有什么想法我在这里做错了什么以及如何修复?感谢您的宝贵时间
    • 其实你不需要使用 DS.Model('array'),只要使用 DS.Model() 就可以了
    • 我使用的是 DS.attr('array') 而不是 DS.Model('array') ,即使使用 DS.attr() 任何一种情况,我仍然收到我之前评论中提到的错误 :)
    • 对不起。我将不得不更多地研究这个问题,因为这适用于我的应用程序。你能做一个jsfiddle吗?另外,你使用的是什么 ember 版本?
    • 当然,将在 jsfiddle 上发布代码并在此处粘贴链接,我使用的是 Ember 1.3
    【解决方案2】:

    试试这个:

    App.Member = DS.Model.extend({                                                                             
        memberid: DS.attr('number'),
        membername: DS.attr('string'),
        memberemail: DS.attr('string'),
        membertype: DS.attr('string'),
        memberprivileges: DS.attr('number'),
        activityID: DS.attr('number')
    });                                                                                                          
    
    
    App.MemberSerializer = DS.RESTSerializer.extend({
        attrs: {
            memberid: 'id',
            membername: 'name',
            memberemail: 'email',
            membertype: 'type',
            memberprivileges: 'privileges',
            activityID: 'ActivityId'
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 2016-06-24
      • 2023-03-10
      • 2016-04-29
      • 1970-01-01
      相关资源
      最近更新 更多