0

我收到此错误:

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

我的控制器非常简单:

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 解决方案(可能是因为它在路由器中,而现在我所有的逻辑都在控制器中,感觉有点乱)。我想我会在升级之前看到我得到的其他答案。

4

1 回答 1

2

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

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

我不知道您使用的是哪个 ember.js 版本,但假设您使用 rc6,您绝对应该查看最新添加的路由器 facelift。另请参阅此处以获取官方发布的博客文章。在您的情况下,尤其是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 
      }
    }
  }
});

因此,基本上在您的情况下,如果用户尝试导航离开,您将对模型进行回滚,然后在完成后重定向用户。

希望能帮助到你。

于 2013-07-06T23:03:56.307 回答