在ember中保存模型时尝试调用loadedData

l33*_*z3r 2 ember.js ember-data

我一直在我的应用程序中收到此错误,但不知道是什么导致它.

每当我提交数据存储时它都会发生:

loadedData在状态rootState.loaded.updated.inFlight中尝试处理事件.调用未定义

任何人?

以下是导致它的代码:

var ts_setting;

ts_setting = Cluey.Setting.find(Cluey.SettingsKeyIDs.API_TIMESTAMP);

if (ts_setting.get('value') != null) {
  console.log("Found Timestamp");
} else {
  console.log("Creating Initial Timestamp...");
  ts_setting.set("id", Cluey.SettingsKeyIDs.API_TIMESTAMP);
  ts_setting.set("value", 0);
  Cluey.store.commit();
}
Run Code Online (Sandbox Code Playgroud)

编辑

我把它归结为导致错误的以下代码(用coffeescript编写).问题是,第一次运行代码时,当数据存储中的对象首次存在时,运行正常.当我在已包含具有指定id的记录的数据存储上运行代码时,会发生错误.这可能有助于您破译正在发生的事情.

ts_setting = Cluey.Setting.find(Cluey.SettingsKeyIDs.API_TIMESTAMP)
ts_setting.get('value')
ts_setting.set("id", Cluey.SettingsKeyIDs.API_TIMESTAMP)
ts_setting.set("value", 0)
Cluey.store.commit()
Run Code Online (Sandbox Code Playgroud)

编辑2

我在创建记录时遇到类似的问题:

ts_setting = Cluey.Setting.createRecord
    id: Cluey.SettingsKeyIDs.API_TIMESTAMP,
    value: 0

Cluey.store.commit()
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我这个错误:

Uncaught Error: Attempted to handle event `loadedData` on <Cluey.Setting:ember327:1> while in state rootState.loaded.created.inFlight. Called with undefined
Run Code Online (Sandbox Code Playgroud)

编辑3

所以事实证明我@timestamp = ts_setting.get('value')在提交商店后正在调用,我认为这是导致问题,因为我试图从尚未保存的对象中获取一些数据.

Cyr*_*uck 6

加载数据是异步的.Cluey.Setting.find返回一个XHR请求成功后将被解析/更新的承诺.

所以你在调用时得到你的承诺Cluey.Setting.find,修改它(ts_setting.set("value", 0))然后在某个时间点,你从服务器得到结果(响应来自find).

此时,ember数据会引发错误,因为它无法更新正在修改的记录.

您要做的是在修改和保存记录之前等待记录完全加载.

ts_setting = Cluey.Setting.find(Cluey.SettingsKeyIDs.API_TIMESTAMP);
ts_setting.one('didLoad', function() {
  ts_setting.set("value", 0);
  Cluey.store.commit();
});
Run Code Online (Sandbox Code Playgroud)