Backbone router.navigate不会触发

时间:2013-01-30 12:04:37

标签: ruby-on-rails backbone.js coffeescript

当我调用导航时,我的路由器没有重定向问题。

我使用'backbone-on-rails'宝石运行Rails设置。

问题似乎与应用初始化的方式有关。

应用

window.App =
  Models: {}
  Collections: {}
  Views: {}
  Routers: {}
  initialize: ->
    new App.Routers.Main()
    Backbone.history.start({pushState: true})

$ ->
  App.initialize()

路由器

class App.Routers.Main extends Backbone.Router

  routes:
    '': 'index'
    'login': 'login'


  initialize: ->
    # Check login status
    @check_login_status()


  initialize_layout: ->
    # Default layout template
    layout        = new App.Views.Layout
    $('#main').html( layout.render().el )

    # Navigation template
    navigation  = new App.Views.Navigation(user: @current_user)
    $('#main nav[role="top"]').html( navigation.render().el )

    # Return this
    this


  index: ->
    @initialize_layout() unless @current_user.get('company_id') is null
    this


  login: ->
    layout        = new App.Views.Layout
    $('#main').html( layout.render().el )

    login       = new App.Views.Login
    $('#main .container-fluid').html(login.render().el)


  check_login_status: ->
    @current_user = new App.Models.CurrentUser
    @current_user.fetch({
      async: false
      success: (data, status, xhr) ->

        # If no user is logged in, and we arent on the login page, redirect to it
        if data.get('company_id') is null and window.location.pathname isnt '/login'
          # Navigate to login page
          window.location.href = '/login'

    })

在我的路由器中,我有一个初始化函数,用于检查用户是否已登录。我console.log是一个简单的状态,可以轻松验证它,实际上它注销了“未登录”。

尽管如此,导航并没有重定向到/ login。

如果我在启动路由器之前启动主干历史记录,那么导航部分可以工作,但是当我刷新页面(cmd + r)时,路由器不会运行索引方法。

1 个答案:

答案 0 :(得分:4)

导航到/login不会触发路由login的原因是前导斜杠。如果省略正斜杠,它应该有效:

self.navigate('login', {trigger: true})

正斜杠 - 前缀URL表示应该在域的根目录中找到路由,即domain.com/login。为了保持在不在应用程序根目录中的URL中运行应用程序的灵活性,比如domain.com/en/login,您应该更喜欢相对URL格式。

你也说:

  

在启动路由器之前启动主干历史记录,然后导航部分工作

这可能不是一个好主意。我不确切地知道它是如何“有效”的,但Backbone documentation在这个主题上非常明确:

  

在页面加载期间在应用程序创建完所有路由器之后,请务必调用Backbone.history.start()或Backbone.history.start({pushState:true})路由初始URL。