1

我正在使用 Ember 1.0.0 pre 并使用 REST 适配器从 Rails API 获取对象。如果通过 REST API 找到对象,我会渲染一个模板,并将找到的模型对象设置为视图的模型。为了做到这一点,我在 Route 中使用了模型钩子,一切似乎都运行良好。自然,如果找不到模型对象,我想渲染一些特殊的 404 模板/视图。问题是如果 REST 适配器返回错误,模型挂钩会停止处理。

我在 ember-data 路线图中看到尚不支持错误处理。

我不明白的是,如果发生错误,为什么 Ember 不会在 Route 中调用重定向挂钩。(我该如何处理这些错误?)

这是路线:

App.MyRoute = Ember.Route.extend({
  renderTemplate: function() {
  this.render('mymodel')    
  },
  model: function(params) {
    return App.MyModel.find(params.id);
  },
  redirect: function() {
    // I want to redirect to another route
    // if the model is not found via the find method.
    // However, this hook is not called if the previous one
    // does not return an object
  }
})

还有其他解决方案吗?我知道,如果视图的模型为空,我可以检查模板,然后渲染部分模板,但问题是视图根本没有渲染(我假设正是因为同样的问题)。

4

1 回答 1

1

我要做的是创建一个摘要,然后让您的路线扩展该路线。我已经为您创建了一个有效的 JSFiddle,但请让我解释一下。

我们App.IndexRoute可以包含 中的所有逻辑App.MyRedirectRoute,但是因为其他路由器可能需要相同的功能,所以最好创建一个抽象,因此如果/当您再次需要此功能时,您可以App.MyRedirectRoute再次扩展以防止重写代码。

不幸的是,Ember.JS 没有逻辑来检测模型是否为空并呈现不同的页面。也许在未来,这将成为现实!(这将是可爱的!),但我们可以自己做到这一点。

我们App.IndexRoute很好很简单:

App.IndexRoute = App.MyRedirectRoute.extend({
    defaultRender: 'home',
    errorRedirectTo: '404',

    model: function(params) {
        // We've found a model!
        return Ember.Object.create({ params: params });
        // We've not found a model!
        return null;
    }
});

如果模型有效,那么我们可以渲染home路线,否则我们将渲染404路线。从路线返回模型没有任何变化。

renderTemplate包含我们用于呈现适当视图的逻辑。因此,我们renderTemplate在抽象中重载方法并执行逻辑操作:

  • errorRedirectTo如果 Ember.JS 认为模型是空的,那么我们将按照;指定的方式渲染视图。
  • 如果模型被认为是有效的,那么我们将呈现默认值,由defaultRender.

如果模型是空的,那么我们将简单地指定我们希望渲染 404 路由 ( errorRedirectTo),但默认情况下我们希望渲染默认路由 ( defaultRender)。

要查看它的实际效果,请查看前面提到的 JSFiddle。注释掉第 27 行以查看呈现的 404 页面,因为对象是null.

我希望这有帮助!

于 2013-02-08T15:23:34.553 回答