Ember.js模型中的保留属性名称

时间:2013-05-13 06:19:40

标签: namespaces ember.js ember-data

我有一个包含以下字段的Post模型:

BlogApp.Post = DS.Model.extend({
    author: DS.attr('string'),
    title: DS.attr('string'),
    preamble: DS.attr('string'),
    content: DS.attr('string'),
    created: DS.attr('date'),
    comments: DS.hasMany('BlogApp.Comment'),
    lastUpdate: DS.attr('date')
});

渲染后,而不是Post.content,结果如下:

<BlogApp.Post:ember272:1>

其他字段渲染都可以。我猜content与某些内部属性冲突。我有几个问题:

  1. 当REST API的名称与Ember内部冲突时,是否存在任何工作原理?
  2. 我应该注意其他的forbiden属性名称吗?
  3. [更新]

    名称冲突与控制器有关,而与模型无关。它不是一个明确的列表,但要注意其他常见的数据库列名,如:

    • 模型
    • 交易
    • is_new
    • IS_DELETED
    • 存储
    • 错误

    我认为Ember开发人员并不像这个可怜的pythonist那样害怕与命名空间相关的错误。

    BTW,Angular.js伙伴们做对了:他们总是用$为API属性和方法添加前缀,有效地防止了这种错误。

3 个答案:

答案 0 :(得分:4)

我正在尝试回答你的两个问题:

<强> 1 您可以为所有键定义映射,这里是content属性

的示例
App.Adapter.map('App.Post', {
  myContent: {key: 'content'}
});

<强> 2 据我所知,在ember中没有这样的explicit保留名称列表,但根据经验,应该避免使用content等非常通用的名称(预防性)

希望有所帮助

答案 1 :(得分:1)

我遇到了同样的问题,上面的解决方案对我不起作用。我正在使用ember 1.5和ember-data 1.0.0-beta.7 + canary,我通过这样做解决了这个问题:

//store.js

LS.SERIALIZATION_KEY_MAPPINGS = {
  'body': 'content'
};

LS.ApplicationSerializer = DS.ActiveModelSerializer.extend({
  keyForAttribute: function(attr) {
    if (LS.SERIALIZATION_KEY_MAPPINGS.hasOwnProperty(attr)) {
      return LS.SERIALIZATION_KEY_MAPPINGS[attr];
    } else {
      return this._super(attr);
    }
  }
});

LS.ApplicationAdapter = DS.ActiveModelAdapter.extend({
  namespace: 'api/v1'
});

//models/learning_object.js
LS.LearningObject = DS.Model.extend({
  name: DS.attr(),
  body: DS.attr(),
)};

答案 2 :(得分:0)

在尝试访问每个助手的把手时,我遇到了一个类似于名为'namespace'的模型属性的问题。 我通过在模型的RestSerializer上设置attrs属性,在ember-cli 0.1.15中解决了这个问题。所以,对于上述内容:

// file: app/serializers/post.js

export default DS.RESTSerializer.extend({
  attrs: {
    body: 'content'
  }
});

其中“body”在您的模型中,“content”在REST服务器有效负载中。

有关详情,请参阅http://emberjs.com/api/data/classes/DS.RESTSerializer.html#property_attrs