如何覆盖ember-data reader方法?或者将DS.attr转换为计算属性?类似于骨干解析

时间:2015-01-21 19:54:11

标签: ember.js ember-data

我有一个返回id, name, properties的端点,属性是一个该死的字符串,用逗号分隔的属性键/值对。是的,你没看错。

properties = "id:1,name:foobar,phone:123456789,taco:true"

当前模型

import DS from 'ember-data';

export default DS.Model.extend({
  contact: DS.belongsTo("contact"),

  name: DS.attr(),
  phone: DS.attr(),
  properties: DS.attr(),
  eachProperties: function () {
    return this.get('properties').split(",").map(function(propertyKeyValuePair) {
      return propertyKeyValuePair.split(":");
    });
  }.property('properties')
});

properties需要一些计算才能对前端有所帮助。

您可以重新使用名为properties的属性,而不是创建一个名为eachProperties的新属性吗?

类似的东西:

export default DS.Model.extend({
  // ... other stuff

  properties: DS.attr(function(model, obj){
    return obj.split(",").map(function(propertyKeyValuePair) {
      return propertyKeyValuePair.split(":");
    });
  });
});

或者如何将api属性名称的名称更改为rawProperties之类的其他名称,然后将计算属性称为properties

我知道你正在思考"只是修复你该死的API" ,但你知道并不总是可能:)

1 个答案:

答案 0 :(得分:0)

经过一些研究,我发现我基本上想利用Transforms (docs)来处理反序列化。它非常容易和rad。

根据Ember-CLI module-directory-naming-structure,您可以在app/transforms/文件夹中添加转换。 我创建了一个名为properties.js的文件。 (无论你命名什么文件都将是属性/转换的名称。)

//*inside app/transforms/properties.js*


import DS from 'ember-data';

export default DS.Transform.extend({
  deserialize: function (serialized) {
    return serialized.split(",").map(function (keyValuePair) {
      return keyValuePair.split(":");
    });
  },
  serialize: function (deserialized) {
    return deserialized.map(function (keyValuePair) {
      return keyValuePair.join(":");
    }).join(",");
  }
});

当您收到json时,以及当您发送JSON时,将使用此转换!超酷。

更新型号:

import DS from 'ember-data';

export default DS.Model.extend({
  contact: DS.belongsTo("contact"),

  name: DS.attr('string'),
  phone: DS.attr(),
  properties: DS.attr('properties')
});

DS.attr('properties')是神奇发生的地方!