Ember:在transition.retry()之后路由ID丢失了 - 我做错了吗?

时间:2013-08-18 09:15:16

标签: ember.js ember-data

参见JSFiddle:http://jsfiddle.net/cyclomarc/MHvrH/3/

有很多示例展示了如何在Ember中实现身份验证。为了保护对路由的访问,如果您没有有效的令牌,您将被重定向到登录页面。成功登录后(因此在获得有效令牌后),您将被重定向到初始请求的页面。

实现:在重定向登录之前,将请求的转换存储在对象中;登录后,您将读取object属性并执行transition.retry。

login: function () {
    var self = this;

    App.Session.set('token', '1234567890');
    var attemptedTransition = App.Session.get('attemptedTransition');

    if (attemptedTransition) {
      attemptedTransition.retry();
    }
    ....

如果您通过根URL访问应用程序,这很有效。你可以在JSFiddle中看到这个。单击出版物以查看出版物列表。然后,如果单击出版物以查看必须登录的详细信息。点击登录(只是模拟成功登录),您将转换到“详细信息”路线。

但是,如果您直接访问“详细信息”网址(e.g. browse to http://yyy/index.html#/publications/1),则存储转换上的.retry将失败。在这种情况下,似乎ID(路线的参数)丢失了。网址变为:http://yyy/index.html#/publications/undefined ...

这是一个已知问题吗?有解决方法吗?

进一步信息:

如果您检查过渡,那么万一它不起作用,则不会设置providedModelsArray。这与Ember.data有关吗?

正确转换(Ember.inspect(savedTransition)):

    {router: [object Object], promise: [object Object], 
data: [object Object], resolvedModels: [object Object], 
providedModels: [object Object], 
providedModelsArray: <App.Publication:ember330:2>, 
sequence: 2, params: [object Object], 
targetName: publications.show, isAborted: true} 

转换错误(Ember.inspect(savedTransition)):

    {router: [object Object], promise: [object Object], 
data: [object Object], resolvedModels: [object Object], 
providedModels: [object Object], 
providedModelsArray: , 
sequence: 1, params: [object Object], 
targetName: publications.show, 
urlMethod: null, isAborted: true} 

1 个答案:

答案 0 :(得分:0)

此问题的原因是show route模型中使用的find。你不应该使用findById(id)。正确的用法是:App.Publication.find(params.publication_id)。