首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止ArrayController添加验证失败的模型

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

Stack Overflow用户
提问于 2013-01-31 19:25:15
回答 2查看 535关注 0票数 0

工作流程是:

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

ArrayController似乎在添加验证失败的记录。

代码语言:javascript
复制
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()会引发异常:

代码语言:javascript
复制
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添加验证失败的记录。

EN

回答 2

Stack Overflow用户

发布于 2013-02-01 01:52:04

尝试在商店中回滚事务。

代码语言:javascript
复制
   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')
     });
   })

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

代码语言:javascript
复制
App.MyRoute = Ember.Route.extend({
    transaction: this.store.transaction();
})

然后创建记录并使用以下方法将其添加到事务中

代码语言:javascript
复制
var company = this.transaction.createRecord(App.Company);

并最终提交或回滚事务。

代码语言:javascript
复制
this.transaction.commit();
this.transaction.rollback();
票数 1
EN

Stack Overflow用户

发布于 2013-02-01 22:02:39

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

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

代码语言:javascript
复制
wireObservers: function(company, router) {
 company.on('becameInvalid', function(record){
   record.deleteRecord();
 });

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

})

我有个关于你工作流程的问题。当您收到验证错误并离开页面时,这意味着用户取消了记录创建。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14633564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档