0

您如何忽略您在 EmberJS 视图中使用 Ember Data 更改的记录?像删除这样的东西,实际上没有从持久存储中删除它。

我以为App.store.removeFromRecordArrays(record);会奏效。

4

2 回答 2

0

如果此模型存在这种情况(删除客户端但不删除服务器端),您可以使用标志扩展 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 周围的代码很难理解,可能不值得麻烦。

于 2012-07-06T08:05:10.657 回答
0

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();
          }             
        }
      });   
    }     
  }
});
于 2012-07-05T19:21:45.630 回答