2

我已经在谷歌上搜索了一段时间,但还没有找到任何好的解决方案。

问题的根源是isDirty使用此方法时没有设置我的记录:

DS.JSONTransforms.object = {
  deserialize: function(serialized) {
    return Ember.isNone(serialized) ? {} : serialized;
  },
  serialize: function(deserialized) {
    return Ember.isNone(deserialized) ? {} : deserialized;
  }
}

据我所知,这是一个显然仍然有效的旧方法,因为它处理我扔给它的 JSON 对象,但isDirty在进行编辑时它没有设置我的记录。

您现在应该使用的是registerTransform您的适配器(根据此https://github.com/emberjs/data/issues/517)。但是我的自定义转换没有被注册,所以我想我把它放在了错误的地方(与我之前的 JSONTransforms 相同的地方)。

DS.RESTAdapter.registerTransform('object', {
  deserialize: function(serialized) {
    return Em.none(serialized) ? {} : serialized;
  },
  serialize: function(deserialized) {
    return Em.none(deserialized) ? {} : deserialized;
  }
});

有没有人有这方面的知识分享?

4

2 回答 2

3

问题isDirty不是因为您没有使用registerTransform,行为将是相同的。

目前,Ember Data 不支持对象属性,其中一个难点实际上是观察设置isDirty标志的变化。

有一个未解决的问题,您可以在 github 上跟踪。

一种解决方法是将嵌套对象声明为正确DS.Model并在它们之间设置嵌入关系。

例如,假设您有一个与 post 一起发送的日期对象:

{post: {
  id: 12
  title: "EmberData accept object attributes, you do not need this anymore !!"
  date: {
    day: "01"
    month: "03"
    year: "2013"
  }
}}

您将声明模型如下:

App.Post = DS.Model.extend({
  title: DS.attr('string'),
  date: DS.belongsTo('App.PostDate')
});

App.PostDate = DS.Model.extend({
  post: DS.belongsTo('App.Post'),
  day: DS.attr('string'),
  month: DS.attr('string'),
  year: DS.attr('string'),
});

并在您的适配器中添加一个映射:

DS.RESTAdapter.map('App.Post',{
  date:{
    embedded:'always'
  }
})

有关嵌入式映射选项的更多详细信息,请参阅此答案

于 2013-02-04T22:49:18.157 回答
0

我不同意。我认为必须对所有孩子的关系/记录进行额外的调用是低效且过于复杂的。我找到了解决这个问题的方法。为“last_updated”添加一个字段,在更改嵌套内容的值后,只需将 last_updated 更新为当前时间,这将触发“isDirty”标志并允许您更新...

于 2013-06-14T04:21:31.883 回答