Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 阻止ArrayController添加验证失败的模型_Javascript_Ember.js - Fatal编程技术网

Javascript 阻止ArrayController添加验证失败的模型

Javascript 阻止ArrayController添加验证失败的模型,javascript,ember.js,Javascript,Ember.js,工作流程是: 用户位于新页面上 点击save,导致模型验证失败。将显示绑定到模型的错误。仍然在同一页上 用户现在导航到索引页,并看到添加到列表中的无效记录 ArrayController似乎正在添加验证失败的记录 App.CompaniesNewRoute = Ember.Route.extend({ model: function(){ var company = App.Company.createRecord(); this.wireObservers(c

工作流程是:

  • 用户位于新页面上
  • 点击save,导致模型验证失败。将显示绑定到模型的错误。仍然在同一页上
  • 用户现在导航到索引页,并看到添加到列表中的无效记录
  • 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
    
    Uncaught错误:试图在状态为rootState.loaded.created.invalid时处理事件'becameClean'。使用未定义的成员数据调用。js:3495
    DS.StateManager.Ember.StateManager.extend.unhandledEvent-Ember-data.js:3495
    

    是否有方法防止ArrayController添加验证失败的记录。

    尝试通过存储回滚事务

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

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

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

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


    我只是想问一下你的工作流程。当您收到验证错误并离开页面时,这意味着用户取消了记录创建

    这似乎是一个不错的模式,我现在正在使用它。但是问题仍然存在,即ArrayController添加对象回滚,因此显示在索引页上。但是现在,
    回滚
    不会抛出任何异常。你能用你的代码设置一个jsbin或JSFIDLE吗?在我看来,问题出在别处。谢谢。现在我已经用完全不同的模式解决了这个问题。如果我再看到这个问题,我会告诉你的。