1

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

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

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

login: function () {
    var self = this;

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

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

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

但是,如果您直接访问“详细” URL (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} 
4

1 回答 1

0

Reason of this problem is the find used in the model of the show route. You should not use findById(id). The correct use is: App.Publication.find(params.publication_id).

于 2013-08-18T12:55:12.703 回答