防止ArrayController添加验证失败的模型

时间:2013-01-31 19:25:16

标签: javascript ember.js

工作流程为:

  1. 用户在新页面上。
  2. 点击保存,导致模型验证失败。显示绑定到模型的错误。仍然在同一页上。
  3. 用户现在导航到“索引”页面,并看到添加到列表中的无效记录。
  4. ArrayController似乎正在添加验证失败的记录。

    App.CompaniesNewRoute = Ember.Route.extend({
    
        model: function(){
          var company = App.Company.createRecord();
          this.wireObservers(company, this);
          return company;
        },
    
        events: {
          save: function(){
            var controller = this.controllerFor(this.routeName);
            controller.get('transaction').commit();
          }
        },
    
       wireObservers: function(company, router) {
         company.on('becameInvalid', function(record){
          // do something to remove it from the arraycontroller
          // record.rollback();
         });
    
         company.on('didCreate', function(){
           router.transitionTo('companies.index')
         });
       })
    })
    

    调用becameInvalid事件。执行record.rollback()会抛出异常:

    Uncaught Error: Attempted to handle event `becameClean` on     <App.Company:ember612:null> while in state rootState.loaded.created.invalid. Called with undefined ember-data.js:3495
    DS.StateManager.Ember.StateManager.extend.unhandledEvent ember-data.js:3495
    

    有没有办法阻止ArrayController添加验证失败的记录。

2 个答案:

答案 0 :(得分:1)

尝试通过商店回滚交易。

   wireObservers: function(company, router) {
     var _self = this;
     company.on('becameInvalid', function(record){
      // do something to remove it from the arraycontroller
       _self.store.rollback();
     });

     company.on('didCreate', function(){
       router.transitionTo('companies.index')
     });
   })

您应该考虑为此目的创建特定事务,而不是使用默认事务。要在路径中创建新事务,您可以执行以下操作

App.MyRoute = Ember.Route.extend({
    transaction: this.store.transaction();
})

然后创建您的记录并使用

将其添加到事务中
var company = this.transaction.createRecord(App.Company);

最后提交或回滚事务

this.transaction.commit();
this.transaction.rollback();

答案 1 :(得分:0)

在您的情况下,我认为rollback()不是解决方案,因为事务已经提交;即使服务器验证失败,该记录也已添加到ArrayController内容中。

我能看到的解决方案是使用deleteRecord函数,如下所示:

wireObservers: function(company, router) {
 company.on('becameInvalid', function(record){
   record.deleteRecord();
 });

 company.on('didCreate', function(){
   router.transitionTo('companies.index');
 });

})

我只是关于您的工作流程的问题。当您收到验证错误并离开页面时,表示用户取消了创建记录