我收到了这个错误:
在状态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解决方案(也许是因为它在路由器中,而现在我的所有逻辑都在控制器中,感觉有点乱)。我想我会在升级之前看到其他答案。
答案 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
}
}
}
});
所以基本上在你的情况下,如果用户试图离开,你会在你的模型上做回滚,然后在完成后重定向用户。
希望它有所帮助。