在路径操作中触发灰烬错误子状态

时间:2014-06-07 22:15:06

标签: ember.js routing

我们假设我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文档,但它似乎只适用于modelbeforeModelafterModel挂钩。我无法让它为create行动而工作。怎么能做到这一点?

3 个答案:

答案 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');

http://emberjs.jsbin.com/xetatoxo/2/edit

答案 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 
});

这样工作可能更容易,因此您不必在每个客户端 - 服务器(承诺)交互上处理错误。