【问题标题】:Correct way of deleting a model record with ember-data使用 ember-data 删除模型记录的正确方法
【发布时间】:2013-09-25 15:21:03
【问题描述】:

我有一个控制器,它列出了系统中的所有计量单位。当用户在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。使用 Promise 的 then() 功能,然后当 Promise 已经实现并且它似乎在本地工作时,我调用 Ember 的 deleteRecord()。我这么说是因为这条记录会立即从屏幕和 Ember 调试器中消失。不幸的是,删除并没有保留到后端,重新加载 hte 页面会立即带回本地“已删除”的记录。

我的问题是:

  1. 这是执行本地删除的合理方式吗?
  2. 如何将删除持久化到后端?

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    在调用uom.deleteRecord() 后,您必须调用uom.save() 才能将更改保存到后端。

    你正在做的事情可能有效,但看起来有点复杂(例如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();
                })
            }
    

    【讨论】:

    • 这是一种更优雅的方式。谢谢。
    • 您能否为较新版本的 Ember 数据更新此答案?它返回一个对get('model') 的承诺。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      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 }); } } });

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

      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(); }); } } });

      【讨论】:

        猜你喜欢
        • 2014-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多