ember hasDirtyAttributes不适用于对象(json)

i86rm4rw  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(341)

我有一个模型:

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

lmyy7pcs

lmyy7pcs1#

进一步的ember开发将减少事件监听器和双向绑定的使用,实际上Glimmer组件只支持One-way Data Flow。因此,在这种情况下,使用单向数据流与ember的未来版本保持友好是一个很好的方法。因此,在我的情况下,我使用ember boostrap解决方案,如下所示

<form.element @controlType="textarea" @onChange={{action 'attributeChange'}}

其中attributeChange动作执行所有工作。
基于modifier的新Glimmer / Octane样式,外观如下:

{{!-- templates/components/child.hbs --}}
<button type="button" {{on "click" (fn @onClick 'Hello, moon!')}}>
  Change value
</button>

相关问题