当我调用导航时,我的路由器没有重定向问题。
我使用'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)时,路由器不会运行索引方法。
答案 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。