如何保存Ember数据记录而不将其提交到后端?

时间:2015-11-16 11:09:12

标签: ember.js ember-data

因此,Ember数据模型的deleteRecord()执行destroyRecord()而不将其提交给后端。

如果save()没有将其提交到后端,该怎么办?

我需要它的原因是我使用自定义服务在一个请求中批量保存不同类型(模型)的多个记录。我成功发送了请求,并且记录保留在后端。

但由于请求未通过Ember Data管道,除非我手动处理,否则服务器的响应将被丢弃。

基本上,我在服务中有这个:

// Accepts an array of records of mixed types,
// both existing and new
batchSave (records) {             

  this
    .customAjax(records)          // The records are persisted
    .then(payload => {            // Response from the backend with updated records
      store.pushPayload(payload); // Now all records have been updated with their current state

      // Now all the records are in their current state.
      // But they are still dirty!
      // How do I mark them clean and saved
    });

我已经看过this但它似乎丢弃了脏属性,而我希望脏属性变得干净。

我也试过了store.didSaveRecord(),但在记录之后仍然很脏。

3 个答案:

答案 0 :(得分:3)

这是@Tom Netzband提案的延伸,带来了更多的糖。

首先,适用于适配器的mixin:

// mixins/prevent-save-adapter.js
export default Ember.Mixin.create({
  preventSave: false,

  updateRecord(store, type, snapshot) {
    if (!this.get('preventSave')) 
      return this._super(store, type, snapshot);
    this.set('preventSave', false);
    return true;
  }
});

然后一个模型:

// mixins/prevent-save-model.js
export default Ember.Mixin.create({
  saveWithoutSave() {
    var modelName = this.constructor.modelName;
    var adapter   = this.adapterFor(modelName);

    adapter . set('preventSave', true);
    return this.save();
  }
});

帖子适配器:

// adapters/post.js
export default ApplicationAdapter.extend(PreventSaveAdapter);

帖子模型:

// models/post.js
export default DS.Model.extend(PreventSaveModel, {
  ...
);

使用此:

// controllers/some-controller.js
export default Ember.Controller.extend({

  actions: {
    someAction () {
      (...)
      post.saveWithoutSave();
    }
  }
});

未测试。

答案 1 :(得分:2)

免责声明:这不是一个理想的解决方案,我希望有人可以指出我们两个方向更好。

编辑: torazaburo在这个问题上的解决方案似乎是最好的方法。

我遇到了同样的情况,并没有找到一个很好的解决方案。我最后编写了一个自定义适配器并添加了一项服务,只要该服务的标志为true,就可以在updateRecord中返回preventRequest: true

示例:

// services/prevent-request.js
export default Ember.Service.extend({
  prevent: false // default
});

// adapters/post.js
export default ApplicationAdapter.extend({
  preventSave: Ember.inject.service(),

  updateRecord (store, type, snapshot) {
    if (this.get('preventSave.prevent')) {
      this.set('preventSave.prevent', false);
      return true;
    }

    this._super(store, type, snapshot);
  }
});

// controllers/some-controller.js
export default Ember.Controller.extend({
  preventSave: Ember.inject.service(),

  actions: {
    someAction () {
      (...)
      this.get('preventSave').set('prevent', true);
      post.save();
    }
  }
});

答案 2 :(得分:0)

根据Ember Guides使用store.createRecord()创建记录并将其添加到商店但不会向后端发出请求。

示例:

store.createRecord('post', {
  title: 'Rails is Omakase',
  body: 'Lorem ipsum'
});

使用this.store在控制器和路由中提供商店对象。

然后,如果你想坚持下去,只需致电save()

示例:

post.save(); // => POST to '/posts'

isDirty表示记录具有适配器尚未保存的本地更改。这包括已创建(但尚未保存)或删除的记录。

脏州有三种子州:

  • uncommitted:商店尚未交出要保存的记录。
  • inFlight:商店已交出要保存的记录,但适配器尚未确认成功。
  • invalid:记录包含无效信息,无法发送到适配器。

如果您想要创建一个干净的记录,请尝试this之类的内容(我未经测试):

record.get('stateManager').send('becameClean');