2

ナビゲートを呼び出したときにルーターがリダイレクトされないという問題があります。

「backbone-on-rails」gem を使用して 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)、ルーターはインデックス メソッドを実行しません。

4

1 に答える 1

4

へのナビゲーションが/loginルートをトリガーしない理由loginは、先頭のスラッシュです。スラッシュを省略すると、次のように機能します。

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

スラッシュがプレフィックスされた URL は、ルートがドメインのルート、つまりdomain.com/login. アプリケーションのルートにない URL (たとえば ) でアプリケーションを実行する柔軟性を維持するにはdomain.com/en/login、相対 URL 形式を使用する必要があります。

あなたはまた言う:

ルーターを起動する前にバックボーン履歴を開始すると、ナビゲート部分が機能します

これはおそらく良い考えではありません。それがどのように「機能する」のか正確にはわかりませんが、バックボーンのドキュメントはこのトピックについて非常に明確です:

ページの読み込み中、アプリケーションがすべてのルーターの作成を完了した後、必ず Backbone.history.start() または Backbone.history.start({pushState: true}) を呼び出して初期 URL をルーティングしてください。

于 2013-01-30T13:33:03.090 に答える