我有一个模型User
如下:
import DS from 'ember-data';
const { attr, Model } = DS;
export default Model.extend({
name: attr("string"),
properties: attr(),
});
User.properties
旨在保存JSON对象。
我正在通过表单(使用ember-one-way-controls)更新模型,如下所示:
{{one-way-textarea
model.name
update=(action (mut model.name))}}
{{one-way-textarea
model.properties.description
update=(action (mut model.properties.description))}}
我有一个按钮,允许用户通过调用discardChanges
操作来放弃更改:
actions: {
discardChanges(model) {
model.rollbackAttributes();
},
},
name
属性更改已正确丢弃/重置,但properties
属性未正确。
我该如何处理?
答案 0 :(得分:2)
问题的根源
Ember Data并不知道这些变化,因为它使用===
运算符将脏污属性与原始属性进行比较。如果发现了更改,Ember Data会将脏污的属性键存储在_attributes
数组中。 We notice this here.然后,当您致电DS.rollbackAttributes()
时,模型会查看_attributes
以确认要恢复的属性。 Here it is.
但哈希是不一样的!
JS是关于通过引用传递的值的全部内容。以下是节点解释器的示例:
> var foo = { description: 'hello' }
undefined
> var bar = foo;
undefined
> bar.description = 'bonjour';
'bonjour'
> bar === foo
true
您正在修改原始对象。
<强>解决方案强>
一种可能的解决方案是深层复制properties
对象,并在调用discardChanges
时手动重置。
您可以将其实施为服务:
import Ember from 'ember';
const { copy, Service } = Ember;
export default Service.extend({
savedProperties: null,
finalize() {
this.set('savedProperties', null);
},
start(model) {
const properties = copy(model.get('properties'));
this.set("savedProperties", properties);
},
undo(model) {
const savedProperties = this.get('savedProperties');
for (const property in savedProperties) {
if (savedProperties.hasOwnProperty(property)) {
const keyPath = `properties.${property}`;
model.set(keyPath, savedProperties[property]);
}
}
this.set('savedProperties', null);
},
});
start
。undo
。finalize
。