Javascript 创建新模型时会出现旧的DS.Model属性

Javascript 创建新模型时会出现旧的DS.Model属性,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,我有一个带有一些嵌套键的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,

我有一个带有一些嵌套键的
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...
    }
  })
  ...
})
以及创建传递到表单的模型的
新路径:

export default Ember.Route.extend({
  model() {
    return this.store.createRecord('resource');
  },
  ...
通过
/resource/new
上的表单创建新模型后,重新访问表单时,
config
仍设置为上次创建模型的值

我可以从中看出该模型是一个不同的实例(在离开初始创建页面之前存储了对
oldModel
的引用):

oldModel.toString()
""
oldModel.get('config.url')
"http://localhost:4000/old"
新型号=$E
newModel.toString()
""
newModel.get('config.url')
"http://localhost:4000/old"

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

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

config: DS.attr({
  defaultValue() {
    return {
      url: '',
      connections: 5,
      request_timeout: 2000,
      //etc...
    };
  }
})
另外,需要记住的一件事是,由于
config
是一个POJO,如果您试图基于
config
中的属性创建观察者或计算属性,那么您将没有绑定

我建议使用以下备选方案之一:

  • 嵌入模型(每个配置都需要一个唯一的id--uuid)
config: DS.attr({
  defaultValue() {
    return {
      url: '',
      connections: 5,
      request_timeout: 2000,
      //etc...
    };
  }
})