用ember-data删除模型记录的正确方法

时间:2013-09-25 15:21:03

标签: ember.js ember-data

我有一个控制器,列出了系统中的所有度量单位。当用户在Uom模型中选择特定记录时,我希望能够将其删除。我正在使用Ember-Data beta-2。这是我到目前为止所做的:

App.UomsController = Ember.ArrayController.extend({
    actions: {
        deleteRecord: function(id) {
            console.log("deleting: " + id);
            var promisedDelete = this.store.find('uom',id).then(function(uom){
                uom.deleteRecord();
            });
        }
    }
});

调用操作deleteRecord传入有效ID并返回promise。使用承诺的then()功能,然后在履行承诺时调用Ember的deleteRecord()并且它似乎在本地工作。我这样说是因为这条记录会立即从屏幕和Ember调试器中消失。不幸的是,删除没有被持久化到后端,并且重新加载hte页面会立即恢复本地“已删除”记录。

我的问题是:

  1. 这是执行本地删除的合理方式吗?
  2. 如何将删除保留在后端?

3 个答案:

答案 0 :(得分:10)

调用uom.save()后,您必须致电uom.deleteRecord()将更改保留在后端。

您正在做的事情可以起作用,但似乎有点复杂(例如this.store.find('uom',id)将导致对后端的不必要请求)。试试这个:

App.UomsItemController = Ember.ObjectController.extend({
    actions: {
        deleteRecord: function() {
            this.get('model').destroyRecord();
            // .destroyRecord() only exists in recent versions of ED
            // for previous versions use .deleteRecord() followed by .save()
            // (though you should really consider upgrading :))
        }
    }
);

App.UomsController = Ember.ArrayController.extend({
    itemController: 'uoms_item'
});

在您的模板中,您将拥有以下内容:

{{#each content}}
    {{name}} <a href="#" {{action "deleteRecord" this}}>Delete</a>
{{/each}}

编辑以回答以下评论:如果this.get('model')正在返回承诺,则以下内容应该有效。

        deleteRecord: function() {
            this.get('model').then(function(item) {
                item.destroyRecord();
            })
        }

答案 1 :(得分:8)

在ember-data v1.0.0-beta.4中,他们添加了一个destroyRecord方法,该方法在一次调用中执行删除和保存。您可以这样使用:

   this.get('model').destroyRecord().then(function() {
      router.transitionTo('users');
   });

答案 2 :(得分:3)

可以在deleteRecord类的任何实例上调用DS.Model方法。它会从商店中删除记录,但它不会在后端保留。

App.UomsController = Ember.ArrayController.extend({ actions: { deleteRecord: function(id) { console.log("deleting: " + id); var promisedDelete = this.store.find('uom',id).then(function(uom){ uom.deleteRecord(); }); } } });

为了在后端保留删除,我们必须在该记录上调用save方法(与createRecord()相同,后跟save()以在后端保存记录):

App.UomsController = Ember.ArrayController.extend({ actions: { deleteRecord: function(id) { console.log("deleting: " + id); var promisedDelete = this.store.find('uom',id).then(function(uom){ uom.deleteRecord(); uom.save(); //The deletion will persist now }); } } });

或者,您也可以使用持久删除的destroyRecord()DS.Model方法。

App.UomsController = Ember.ArrayController.extend({ actions: { deleteRecord: function(id) { console.log("deleting: " + id); var promisedDelete = this.store.find('uom',id).then(function(uom){ uom.destroyRecord(); }); } } });