忽略EmberJS Data中的更改记录

时间:2012-07-05 14:48:40

标签: ember.js ember-data

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

我认为App.store.removeFromRecordArrays(record);会起作用。

2 个答案:

答案 0 :(得分:0)

1)您可以使用事务并回滚事务。

2)或者你可以使用它的statemanager来回滚记录。

if(record.isDirty)
  record.get('transaction').rollback();

例如,您可以循环存储记录缓存中的所有记录并回滚脏记录。

我个人在视图中的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();
          }             
        }
      });   
    }     
  }
});

答案 1 :(得分: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周围的代码很难理解,可能不值得麻烦。