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

How to overwrite ember-data reader method? or convert DS.attr to computed property? similar to backbone parse

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

属性 = "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

我知道你在想 "Just fix your damn API" 但你知道这并不总是可能的:)

经过一些研究,我发现我基本上想利用 Transforms (docs) 来处理反序列化。它超级简单和rad。

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

//*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') 是奇迹发生的地方!