接收404时的EmberJS模型路线

时间:2014-05-16 04:18:52

标签: ember.js ember-data

(同样的文字也在EmberJS讨论区开放)

我有以下路线:

App.IndexCrmPersonEditRoute = Ember.Route.extend({
    model: function(params) {
        var person = this.store.find("person", params.id);
        return person;
    },
});

接收以下路由器路径

...
this.route('edit', { path: ':id'}); // edit person
...

对现有人来说很有效。当对象不存在时,API返回404,其中包含以下内容:

{"person": null}

错误" 加载路线时出错:未定义"发生在JS。

我想知道返回404 + person = null是否是正确的方法,是否可以显示消息并将用户重定向回上一个URL(如果响应为404,甚至不移动它们)。 / p>

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

好吧,多亏了上面的2个答案,我找到了路由器的“错误”操作的解决方案,我将在下面介绍。

http://emberjs.com/guides/routing/loading-and-error-substates/#toc_code-error-code-substates-with-dynamic-segments

文档不是很好,但这是我实现的目的:

我写了一个通用的Route类,用“错误”动作进行扩展:

App.NotFoundObjectRoute = Ember.Route.extend({
    actions: {
        error: function(reason, transition) {
            if (reason.status == 404)
                return true
            else
                this.transitionTo('r500');
        },
    },
});

我希望每条路线都有“未找到”beheaviour,我写道和错误路线,如下所示(注意“错误”这个词自动取代“编辑”,如同EmberJS的标准:

App.IndexCrmPersonEditRoute = App.NotFoundObjectRoute.extend({
  // ...
});

App.IndexCrmPersonErrorRoute = Ember.Route.extend({
  // Called for errors like 404 (not found) and 500 (server error)
});

转而写了一个错误视图,如下所示:

App.IndexCrmBusinessErrorView = Em.View.extend({
    templateName: "r404",
});

我使用了标准的“r404”模板,但正如您所看到的,对于每种不同的对象类型,它可能是不同的。

“r500”路由在服务器错误(404除外)的情况下起作用。

我希望这对其他人有所帮助。

答案 1 :(得分:2)

1)如果模型挂钩中的promise失败,则交易将无法完成。所以,你不需要交易回来。

2)您可以在路由错误处理程序中管理错误。

3)您的回复不需要{person:null},提供状态代码404就足够了。在这种情况下,您的ajax承诺将失败,因为您返回了http错误代码。

http://emberjs.jsbin.com/kimol/1/edit