2014-10-17 55 views
1

我在Backbone Marionette應用程序中遇到了一個奇怪的情況。如果用戶點擊facebook/twitter鏈接,然後單擊瀏覽器後退按鈕,而不是重新加載我的應用程序,它只顯示json,如果我去example.com/posts.json而不是example.com/posts。如果用戶手動重新加載頁面,它會加載正常,但是讓用戶看到json非常混亂。後退按鈕不會重新觸發骨幹應用程序

如果我在example.com/posts,然後手動導航離開說gmail.com並單擊後退按鈕它工作正常。這似乎是當我的應用程序中的鏈接被點擊,這種情況出現。

任何想法如何我可以「強制」Backbone應用程序重新加載時,單擊返回按鈕導航回到我的應用程序?

編輯:

添加我的Rails控制器 - 它是擊中索引。但點擊返回按鈕,它似乎是觸發JSON主場迎戰HTML(雖然在同一頁面上刷新使其擊中正確的HTML)時:

class SurveysController < ApplicationController  
    # GET /surveys 
    # GET /surveys.json 
    def index 
    if cookies[:sample_user_id] && !User.find(cookies[:sample_user_id]).admin? 
     if !cookies[:sample_appuser_token] 
     appuser = Appuser.create 
     sign_in_appuser appuser 
     else 
     appuser = current_appuser 
     end 
     @surveys = User.find(cookies[:sample_user_id]).surveys.includes([:responses => [:choices], :questions => [:answers]]) 
    else 
     if !cookies[:sample_appuser_token] 
     appuser = Appuser.create 
     sign_in_appuser appuser 
     else 
     appuser = current_appuser 
     end 
     @surveys = Survey.where(status: "Submitted") 
     if cookies[:sample_user_id] 
     User.find(cookies[:sample_user_id]).surveys.each do |survey| 
      @surveys << survey 
     end 
     end 
    end 
    end 

而且index.html.erb視圖:

<div id="wrap"> 
    <div id="header-region"></div> 
    <div id="main-region"></div> 
    <div id="push"></div> 
</div> 
<div id="footer-region"></div> 
<div id="dialog-region"></div> 
<%= debug(params) if Rails.env.development? %> 

<%= javascript_tag do %> 
    $(function() { 
    Sample.start({ 
     environment: "<%= Rails.env %>" 
    }); 
    }); 
<% end %> 

SurveysRouter:

@Sample.module "SurveysApp", (SurveysApp, App, Backbone, Marionette, $, _) -> 

    class SurveysApp.Router extends Marionette.AppRouter 
    appRoutes: 
     ""   : "list" 
     ":id"   : "show" 
     ":id/take": "take" 

    API = 
    list: -> 
     if $.cookie('sample_user_email') != null 
     new SurveysApp.List.Controller 
     else 
     window.location = "/signin" 

    show: (id) -> 
     window.fragment = Backbone.history.fragment 
     if $.cookie('sample_user_email') != null 
     new SurveysApp.Show.Controller 
      id: id 
     else 
     console.log Backbone.history.fragment 
     window.location = "/signin" + "#" + window.fragment 

    take: (id, survey) -> 
     new SurveysApp.Take.Controller 
     id: id 
     survey: survey 

    newSurvey: (surveys, survey) -> 
     if $.cookie('sample_user_email') != null 
     new SurveysApp.New.Controller 
      surveys: surveys 
      survey: survey 
     else 
     window.location = "/signin" 

    App.vent.on "survey:clicked", (survey) -> 
    App.navigate "/" + survey.id 
    API.show survey.id 

    App.vent.on "new:survey", (surveys, survey) -> 
    API.newSurvey surveys, survey 

    App.vent.on "take:survey:button:clicked", (survey) -> 
    App.navigate "/" + survey.id + "/take" 
    API.take survey.id, survey 

    App.vent.on "survey:list", -> 
    App.navigate "/" 
    API.list() 

    App.addInitializer -> 
    new SurveysApp.Router 
     controller: API 

列表控制器:

@Sample.module "SurveysApp.List", (List, App, Backbone, Marionette, $, _) -> 

    class List.Controller extends App.Controllers.Application 

    initialize: -> 
     surveys = App.request "survey:entities" 

     App.execute "when:fetched", surveys, => 
      @layout = @getLayoutView() 

      @listenTo @layout, "show", => 
      @surveyRegion surveys 
      @bannerRegion surveys 

     @show @layout 
     App.request "header:footer" 

    surveyRegion: (surveys) -> 
     surveyView = @getSurveyView surveys 

     @listenTo surveyView, "childview:survey:clicked", (args) -> 
     if args.model.get('status') == "Draft" 
      App.vent.trigger "new:survey", surveys, args.model 
     else 
      App.vent.trigger "survey:clicked", args.model 


     @listenTo surveyView, "childview:take:survey:button:clicked", (child, args) -> 
     survey = args.model 
     survey.set(preview: true) 
     App.vent.trigger "take:survey:button:clicked", survey 

     @show surveyView, region: @layout.surveyRegion 

    getLayoutView: -> 
     new List.Layout 

    getSurveyView: (surveys) -> 
     new List.Surveys 
     collection: surveys 

    bannerRegion: (surveys) -> 
     bannerView = @getBannerView surveys 

     @listenTo bannerView, "new:survey:clicked", -> 
     App.vent.trigger "new:survey", surveys 

     @show bannerView, region: @layout.bannerRegion 

    getBannerView: (surveys) -> 
     new List.Banner 
     collection: surveys 

和頁腳模板,其中鏈接:

<div class="container"> 
    <div class="row"> 
     <div class="col-sm-6 align-center"> 
     <a href="/privacy" id="footer-privacy-link">Privacy</a> 
     <a href="/contact">Contact us</a> 
     <div>©2014 Sample, LLC</div> 
     </div> 
     <div class="col-sm-4 align-center"> 
     <a class="facebook" href="https://www.facebook.com/sample"><i class="fa fa-facebook"></i></a> 
     <a class="twitter" href="https://twitter.com/sample"><i class="fa fa-twitter"></i></a> 
     <a class="email-link" href="/contact"><i class="fa fa-envelope"></i></a> 
     </div> 
    </div> 
</div> 
+0

看到一些有問題的代碼會很有幫助。 – pdoherty926 2014-10-17 21:16:09

回答

1

什麼你所描述使得它聽起來像example.com/posts.json已作爲一個進入瀏覽器的歷史。但是,AJAX調用通常不會添加到歷史記錄中,因此您的代碼中似乎必須有錯誤的router.navigatewindow.location =行或類似內容。但是,如果沒有看到相關的代碼,就無法確定。

+0

我添加了一堆代碼,但通過它看,沒有什麼是真的彈出。你說什麼是有道理的,但我會繼續瀏覽它,以及...... :) – 2014-10-17 23:07:39

+0

是的,我沒有看到你提供的代碼中有任何明顯的錯誤。爲了便於調試,你可能想要做的一件事是打開Backbone的副本,並找到'Backbone.history'的'navigate'方法(我的副本中的第1469行,但是你的第#行可能有所不同),然後添加一個'console .trace()'或'debugger'行,以便您可以在代碼調用時判斷。如果你的問題是一個錯誤的導航行,這應該有助於你找到它(如果沒有,至少你會知道尋找'window.location ='或一些手動歷史操作代碼)。 – machineghost 2014-10-17 23:29:38