gpt4 book ai didi

ember.js - 如何使用 ember-data 手动将对象状态设置为清理(已保存)

转载 作者:行者123 更新时间:2023-12-02 13:11:57 27 4
gpt4 key购买 nike

说明:

我正在我的一个项目中使用 ember-data,我有一个问题,围绕着弄脏对象然后故意将其状态设置为干净的可能性 - 而不提交更改。场景是这样的:

假设我通过 banana = App.Fruit.find('banana'); 获取了一个对象,并且它有“黄色水果!”的描述。使用 XHR 长轮询(或 WebSockets),我可能会收到该对象的更新版本,因为另一个用户已将描述更改为“美味的黄色水果!”在任何给定的时间点我获取原始对象之后。

然后,我想做的是更新对象以反射(reflect)新接收到的数据。为此,我尝试了不同的方法:

  • 我尝试调用 App.Store.load(App.Fruit, new_data);。首先,这种方法行不通,其次,这不是我真正想要的。我可以自己对对象进行未提交的更改,在这种情况下,直接丢弃这些更改是不可取的(假设 load() 调用会覆盖它们)。

  • 我尝试循环访问新数据,调用 .set() - 像这样:banana.set('description', new_data.description); - 为了使用新数据更新对象属性(如果适用=不脏)。这可行,但会使对象处于脏状态。

为了使对象再次干净/更新 - 并且让适配器提交更改! - 我已经查看了对象所经历的状态。这些(至少)是:

  • 第 1 步:最初,对象处于 rootState.loaded.saved 状态。
  • 第 2 步:对属性调用 .set() 将其推送到 rootState.loaded.updated.uncommissed 状态。
  • 第 3 步:调用 App.store.commit(); 将对象返回到 rootState.loaded.saved 状态。

因此,我尝试在第 2 步之后手动将对象状态设置为 saved,如下所示: banana.get('stateManager').goToState('saved');.

但是,这不起作用。下次存储由于任何其他原因提交时,此操作会产生 inFlightDirtyReasons is undefined 错误。

问题:

我的问题是:如何手动将脏对象的状态再次更改回干净(已保存)?

最佳答案

Ember Data 1.0.0-beta.7的解决方案:

// changing to loaded.updated.inFlight, which has "didCommit" 
record.send('willCommit');
// clear array of changed (dirty) model attributes
record.set('_attributes', {});
// changing to loaded.saved (hooks didCommit event in "inFlight" state)
record.send('didCommit');

我搜索了Ember-data的源代码,发现loaded.saved状态有一个设置函数,可以在设置“saved”状态之前检查模型是否干净。如果它不干净,那么它会拒绝更改状态的请求并返回到loaded.updated.uncommissed。

因此,您必须清理 model._attributes 数组,该数组保留属性名称,并且 Ember 将允许您手动更改状态。

我知道这不是很好的解决方案,因为需要设置模型的私有(private)属性,但我还没有找到任何其他解决方案。

关于ember.js - 如何使用 ember-data 手动将对象状态设置为清理(已保存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13342250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com