如何销毁无法保存的记录?

时间:2014-02-03 16:34:46

标签: ember.js ember-data

我在路线上有一个createDocument动作。该操作会创建一条记录并尝试将其保存在服务器上。

如果服务器发回错误,我想从商店中删除记录。

这是一段代码:

App.ProjectsmanageRoute = Ember.Route.extend({
  model : function(){
    return this.store.find('document');
  },

  actions : {
    createDocument : function(){
      var store=this.store;

      var doc = store.createRecord('document', {
        title: "New"
      });

      this.set('currentDoc', doc);

      doc.save().then(this.newDocSuccess, this.newDocFailure);
    }
  },

  newDocSuccess: function () {
    this.transitionTo('editdocument', this.get('currentDoc'));
  },

  newDocFailure: function () {
    console.log("Error when creating document");
    console.log(this.get('currentDoc'));
    this.store.deleteRecord(this.get('currentDoc'));
    this.set('currentDoc', null);
  }

});

错误消息在控制台中正确显示。但无论如何我的记录都没有从商店中删除。

这段代码有什么问题?他们是另一种处理保存记录错误的方法吗?

感谢您的回答。

2 个答案:

答案 0 :(得分:1)

我完全错过了明显的问题,deleteRecord之后你需要致电save。此外,商店没有必要,你可以在记录上做到。

this.get('currentDoc').deleteRecord();
this.get('currentDoc').save();

答案 1 :(得分:0)

经过多次测试,我明白这是一个Javascript问题而不是Ember问题。由于我将路由函数作为then()的回调附加,因此这些函数中的“this”关键字没有指向任何东西。

我必须像这样转换代码

App.ProjectsmanageRoute = Ember.Route.extend({
  // ...

  actions : {
    createDocument : function(){
      var store=this.store;

      var doc = store.createRecord('document');

      this.set('currentDoc', doc);

      // The context will change, register this as that
      that = this;

      // Registering anonymous function as callback that call the 
      // route's functions
      doc.save().then(
        function () {
          that.newDocSuccess();
        },
        function () {
          that.newDocFailure();
        }
      );
    },
  },

  newDocSuccess: function () {
    this.transitionTo('editdocument', this.get('currentDoc'));
  },

  newDocFailure: function () {
    var currentDoc = this.get('currentDoc');
    alert("Error when creating document");
    currentDoc.deleteRecord();
    currentDoc.save();
    this.set('currentDoc', null);
  }

});

不管怎么说,如果他们处理这个问题比在then()中注册2个匿名函数更好。