我们假设我BananaNewRoute
负责显示新的Banana
表单并创建Banana
。
App.BananaNewRoute = Ember.Route.extend
model: -> @store.createRecord('banana')
actions:
create: @currentModel.save().then => @transitionTo "banana", @currentModel
由于我的应用程序输入受到严格控制,因此可以安全地假设服务器返回任何类型的错误,那么它就是一个应用程序错误,用户无法做任何事情关于它。我希望每当error
操作拒绝时,将用户转换为单独的save
模板即可解决此问题。
我查看了Loading / Error Substates文档,但它似乎只适用于model
,beforeModel
和afterModel
挂钩。我无法让它为create
行动而工作。怎么能做到这一点?
答案 0 :(得分:1)
save
返回一个承诺。然后承诺传递和失败的功能(原谅转换后的咖啡因)。
save().then ((results) ->
console.log "it worked", results
return
), (error) ->
console.log "it failed", error
return
或在javascript中,并将其分解
var pass = function(results){};
var fail = function(error){};
save().then(pass, fail);
要手动转换到错误路由,您只需要调用
this.transitionTo('error', reason);
示例http://emberjs.jsbin.com/xetatoxo/1/edit
对于更深层的错误路线也可以这样做
this.transitionTo('foo.error', 'it died');
答案 1 :(得分:0)
为了正确转换到路由器操作中的错误子状态,您可以使用Route#intermediateTransitionTo,这样您就可以转换到错误子状态而无需转换网址。
您的更新代码如下所示
App.BananaNewRoute = Ember.Route.extend
model: -> @store.createRecord('banana')
actions:
create: @currentModel.save().then(
() => @intermediateTransitionTo("banana", @currentModel))
答案 2 :(得分:0)
您还可以为所有承诺使用全局错误处理程序,如下所示:
// Global error handler for promises
Ember.RSVP.on('error', function(error) {
//do whatever needed
});
这样工作可能更容易,因此您不必在每个客户端 - 服务器(承诺)交互上处理错误。