我有一个模型:
export default Model.extend({
title: attr('string'),
attributes: attr('jsonb')
});
其中attributes
是自定义的json
文件,在Postgres中存储为jsonb
。
让我们说:
{
"name":"Bob",
"city":""
}
因此,我可以使用模板轻松地操作attributes
<form.element .. @property="attributes.city"/>
或model.set('attributes.city','city name')
问题:hasDirtyAttributes
不会改变,因为从技术上讲,我们有旧对象。但当我尝试复制对象时,假设JSON.parse(JSON.stringify(this.get('attributes'))
hasDirtyAttributes
按预期工作
因此,如何为Model
编写一些Mixin
或其他变通办法,在任何attribute
属性发生变化时,将hasDirtyAttributes
标记为true
。我将更新整个对象,因此实际上哪个属性发生了变化并不重要。
同样的问题:https://discuss.emberjs.com/t/hasdirtyattributes-do-not-work-with-nested-attributes-json-api/15592
现有的解决方案根本不适合我:
- ember变脏
- ember数据关系跟踪器
- ember-data-model-fragments(引擎盖下有很多更改,并损坏了我的应用程序)
更新日期:
一些不完美的想法,有助于更好地描述我正在想要实现的目标:假设我们将观察者添加到任何对象fileds
:
export default Model.extend({
init: function(){
this._super();
this.set('_attributes', Object.assign({}, this.get('attributes'))); //copy original
Object.keys(this.get('attributes')).forEach((item) => {
this.addObserver('attributes.'+ item, this, this.objectObserver);
});
}
...
})
和观察员:
objectObserver: function(model, filed){
let privateFiled = '_' + filed;
if (model.get(privateFiled) != model.get(filed)) { //compare with last state
model.set(privateFiled, this.get(filed));
model.set('attributes', Object.assign({}, this.get('attributes')) );
}
}
它是工作的,但是当我改变object
中的一个filed
时,由于复制对象objectObserver
,在每个字段上再次进行了faired。所以在这个键中,改变object
中的每个filed
,我将观察到的字段标记为dirty
1条答案
按热度按时间lmyy7pcs1#
进一步的
ember
开发将减少事件监听器和双向绑定的使用,实际上Glimmer组件只支持One-way Data Flow
。因此,在这种情况下,使用单向数据流与ember
的未来版本保持友好是一个很好的方法。因此,在我的情况下,我使用ember boostrap
解决方案,如下所示其中
attributeChange
动作执行所有工作。基于
modifier
的新Glimmer / Octane样式,外观如下: