创建新模型时会显示旧的DS.Model属性



我有一个带有一些嵌套键的DS.Model

export default DS.Model.extend({
  name: DS.attr('string'),
  slug: DS.attr('string'),
  status: DS.attr('string'),
  config: DS.attr('', {
    defaultValue: {
      url: '',
      connections: 5,
      request_timeout: 2000,
      etc...
    }
  })
  ...
})

以及创建传递到表单的模型的new路由:

export default Ember.Route.extend({
  model() {
    return this.store.createRecord('resource');
  },
  ...

/resource/new处通过表单创建新模型后,在重新访问表单时,config仍设置为上次创建的模型的值。

我可以通过Ember Inspector看到该模型是一个不同的实例(在初始创建时离开页面之前,已经存储了对oldModel的引用):

oldModel.toString()
"<web@model:app::ember731:null>"
oldModel.get('config.url')
"http://localhost:4000/old"
newModel = $E
newModel.toString()
"<web@model:app::ember894:null>"
newModel.get('config.url')
"http://localhost:4000/old"

您遇到的问题是由于model.config在所有模型实例之间共享,因为它是在扩展时创建的,而不是在每个模型实例的创建时创建的。这是一个JavaScript概念,请参阅此SO答案以了解更多信息。

您希望每个模型都有自己的config:实例

config: DS.attr({
  defaultValue() {
    return {
      url: '',
      connections: 5,
      request_timeout: 2000,
      //etc...
    };
  }
})

此外,需要记住的一点是,由于config是一个POJO,如果您尝试基于config中的属性创建观察者或计算属性,则不会有绑定。

我建议使用以下替代方案之一:

  • https://github.com/lytics/ember-data-model-fragments
  • http://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html嵌入模型(需要每个配置有一个唯一的id--uuid)

最新更新