您如何忽略您在 EmberJS 视图中使用 Ember Data 更改的记录?像删除这样的东西,实际上没有从持久存储中删除它。
我以为App.store.removeFromRecordArrays(record);
会奏效。
您如何忽略您在 EmberJS 视图中使用 Ember Data 更改的记录?像删除这样的东西,实际上没有从持久存储中删除它。
我以为App.store.removeFromRecordArrays(record);
会奏效。
如果此模型存在这种情况(删除客户端但不删除服务器端),您可以使用标志扩展 DS.Model。此外,还有一种方法可以方便地设置此状态(调用 model.deleteLocal())。
DS.Model.reopen({
deleteLocalFlag: false,
deleteLocal: function () {
this.set('deleteLocalFlag',true);
this.deleteRecord();
}
});
然后你需要在你的适配器中自定义 deleteRecords 方法。
DS.YourAdapter.reopen({
deleteRecord: function(store, type, model) {
if (!model.get('deleteLocalFlag') {
// code for deleting in persitence layer
}
store.didDeleteRecord(model, model.toJSON({associations: true}));
}
});
警告:此代码未经测试,但在我脑海中有效;)
可能是更清洁的解决方案是使用对象的 stateManager 并转换到不同的状态而不是设置标志。但我发现 stateManager 周围的代码很难理解,可能不值得麻烦。
1)您可以使用交易并回滚交易。
2)或者您可以使用它的状态管理器回滚记录。
if(record.isDirty)
record.get('transaction').rollback();
例如,您可以循环存储 recordCache 中的所有记录并回滚所有脏记录。
我个人在视图中的 willDestroyElement 事件上使用了记录回滚机制,所以如果用户离开视图,他会被要求保存脏记录。
PatientTransport.FirmView = Ember.View.extend({
templateName: 'firm-view',
willDestroyElement: function() {
if (this.getPath('controller.content.isDirty')) {
var self = this;
Bootstrap.ConfirmBox.popup({
heading: "Some data has changed.",
message: "Do you want to save changes?",
callback: function(options, event) {
if (options.primary) {
self.getPath('controller.content.transaction').commit();
} else {
self.getPath('controller.content.transaction').rollback();
}
}
});
}
}
});