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

时间:2015-11-13 16:41:52

标签: 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,
      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"

1 个答案:

答案 0 :(得分:0)

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

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

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

另外,要记住的一件事是,由于config是POJO,如果您尝试根据config中的属性创建观察者或计算属性,则不会具有绑定。

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