如何防止我的余烬数据模型被修改然后重新加载

时间:2013-07-06 21:59:42

标签: ember.js ember-data

我收到了这个错误:

  

在状态rootState.loaded.updated.uncommitted中尝试处理事件loadedData

我的控制器非常简单:

App.JudgeController = Ember.ObjectController.extend({
    isEditing: false,

    edit: function() { this.set('isEditing', true); },
    done: function() { this.get("store").commit(); this.set('isEditing', false); }    
});

我有一张表格,这是一个简化版本:

<button class="btn btn-link" {{action 'edit'}} {{bindAttr disabled='isEditing'}}>Edit</button>
{{#if isEditing}}
    {{view Ember.TextField placeholder="First Name" valueBinding="firstname"}}
    <button type="button" class="btn btn-primary" {{action 'done'}}>Done</button>
{{#if isEditing}}

我在顶部有一个导航栏。因此,用户可以单击导航栏并在编辑时离开页面,而无需单击“完成”按钮。然后,如果他们回到那个页面,他们会得到我在开始时提到的那个错误。

我该怎么办?我有一堆表格,他们都有类似的问题。有最好的做法吗?

也许有一种方法可以在用户导航时调用我的控制器上的方法?然后我可以回滚,或向用户显示警告和/或阻止他们离开。

编辑:我目前正在使用Ember.js的RC5。但我并不反对升级它。 我真的不喜欢willTransition解决方案(也许是因为它在路由器中,而现在我的所有逻辑都在控制器中,感觉有点乱)。我想我会在升级之前看到其他答案。

1 个答案:

答案 0 :(得分:2)

  

也许有一种方法可以在用户导航时调用我的控制器上的方法?然后我可以回滚,或向用户显示警告和/或阻止他们离开。

非常好的假设!确实,你提到的确实可以做到。

我不知道您使用的是哪个版本的ember.js,但假设您使用的是rc6,那么您一定要查看最新添加的router facelift。另请参阅此处了解正式版blog post。在您的情况下,尤其是willTransition挂钩接缝是相关的,因为所有转换类型(URL更改和transitionTo)将在当前活动的路由上触发willTransition事件。这使得活动路线有机会有条件地阻止转变发生。一个例子就是在你填写半满的表格时阻止导航:

App.FormRoute = Ember.Route.extend({
  events: {
    willTransition: function(transition) {
      if (!this.controller.get('formEmpty')) {
        transition.abort();
        // now you can do the rollback on your models
        // and with transition.retry() you can redirect the user 
      }
    }
  }
});

所以基本上在你的情况下,如果用户试图离开,你会在你的模型上做回滚,然后在完成后重定向用户。

希望它有所帮助。