在页面加载之前/之后的ember中的条件重定向

时间:2014-01-21 08:45:47

标签: ember.js

我正在尝试编写一些逻辑,如果用户已登录(因此定义了currentUser变量,下面的编辑部分中有更多详细信息),他应该无法访问根URL应用程序,即登录页面。我试图在页面加载之前/之后使用重定向到users.show页面来实现此目的,但我似乎无法弄清楚如何执行此操作。

阅读余烬文档,您可以从路径或控制器进行重定向。我试过了两个,但都没有奏效。在路线:

App.ApplicationRoute = Ember.Route.extend
  redirect: ->
    currentUser = @controllerFor('Application').get('currentUser') # this works
    currentPath = @controllerFor('Application').get('currentPath') # this returns undefined
    if currentUser && currentPath == '/'
      @transitionTo('users.show', currentUser)

这里的问题是我出于某种原因无法读取currentPath,即使我可以从App.ApplicationController内访问它。

在控制器中,我尝试过:

App.ApplicationController = Ember.Controller.extend
  init: -> # never gets called
    if @get('currentUser') && @get('currentPath') == '/'
      @transitionToRoute('users.show', @get('currentUser'))

除了在加载页面时永远不会调用init,我无法从文档中找出在页面加载时调用哪个钩子。

如果代码有任何其他问题,请随时指出。如何修复代码以实现重定向?

编辑:建议路线实施将'application'更改为@controllerFor('application')中的小写。试过这个并返回错误

Assertion failed: The controller named 'application' could not be found. Make sure that this route exists and has already been entered at least once. If you are accessing a controller not associated with a route, make sure the controller class is explicitly defined.

不确定是怎么回事,因为对所有小写作品中的其他路线执行@controllerFor,而不是'application'

当前用户变量是通过在ember初始化程序中注入获得的。我在我的后端使用Rails和Devise,并且currentUser基本上或多或少地ApplicationRoute进入ember this tutorial。一般流程是Rails - >元标记 - >初始化程序 - >注射。

解决方案:受到接受答案后的讨论的启发,我最终在App.ApplicationRoute = Ember.Route.extend beforeModel: (transition) -> currentUser = @controllerFor('currentUser') if currentUser && transition.targetName == 'index' @transitionTo('users.show', currentUser) 中这样做了:

{{1}}

1 个答案:

答案 0 :(得分:0)

我没有看到您试图从应用程序路径获取应用程序控制器。我不是百分百肯定会工作的。我相信在redirect被调用之前,在路由过程中很早就会调用setupController钩子。这意味着您的init方法不太可能在redirect挂钩之前被调用。

我有两个可能的解决方案:

  1. 似乎currentUser变量是从某种全局信息创建的。如果是这种情况,请在路线中创建,并在必要时进行转换。如果您仍希望在控制器中注入数据,请使用setupController挂钩将其放在那里。

  2. 如果currentUser变量恰好是该特定路线的模型,请尝试转换afterModel挂钩。这样您就可以直接访问数据。

  3. 另外,我会尽量避免控制器中的转换。尽可能将它们留在路线中。

    如果您可以向我提供有关currentUser变量来源的更多信息,我可以给您一个更具体的答案。

    编辑:这段代码来自您发布的文章:

    controller = container.lookup('controller:currentUser').set('content', user)
    

    如果这与您正在使用的相似,请尝试将其注入路线而不是控制器。

    controller = container.lookup('route:currentUser').set('currentUserModel', user)
    

    然后,您只需在路线中使用@get('currentUserModel')即可。并且,如果由于某些原因不起作用,只需将用户置于全局范围内,只是为了确保您没有其他错误。所以不是上面的那一行:

    App.TEMP_CURRENT_USER = user;