我有一个带有一些嵌套键的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)