2013-05-02 50 views
8

我會通過有問題的流程走...如何將觸發頁面刷新的鏈接與Angular的html5Mode = true混合,而不會打破後退按鈕?

  • 我加載google.com(只是作爲一個起點)
  • 我轉到app.com
  • 我資產淨值對app.com/projects
  • 我NAV到app.com/api/test(通過window.location的)
  • 我看到原始的JSON(好爲止......)
  • 我壓回,網址更改爲app.com/projects,但我還是看到了JSON。
  • 我按下回來,網址更改爲app.com,但我還是看到了JSON。
  • 我再次按下,google.com負荷。
  • 我奮力向前,app.com加載罰款......一切恢復正常

什麼奇怪的,是我觀察到這隻有當html5Mode = true在Webkit- Firefox的工作方式所需 .. 。

。 。 。

首先,我的server.coffee看起來像這樣:

app.get '/partials/:partial', routes.partials 
app.get '/api/test', api.test 
app.get '*', routes.index 

基本上,所有請求加載索引(其自舉角),與例外爲視圖/部分處理程序,一個測試API路線用原始的JSON響應。

。 。 。

(我使用的是ui-router模塊用於管理嵌套視圖和UI狀態;它使用$urlRouterProvider,這非常類似於角的$routeProvider

其次,我app.coffee看起來是這樣的:

app = angular.module('app', ['ui-router']) 
.config([ 
    '$stateProvider' 
    '$locationProvider' 
    '$urlRouterProvider' 
    ($stateProvider, $locationProvider, $urlRouterProvider)-> 
     $urlRouterProvider 
      .when('/api/test', [ 
       '$window' 
       '$location' 
       ($window, $location)-> 
        $window.location.href = '/api/test' 
      ]) 
      .otherwise('/') 
     $stateProvider 
      .state 'home', 
       url: '/' 
       templateUrl: 'partials/index' 
       controller: 'IndexCtrl' 
      .state 'projects', 
       url: '/projects' 
       templateUrl: 'partials/projects' 
       controller: 'ProjectsCtrl' 
     $locationProvider.html5Mode(true).hashPrefix '!' 
]) 

由於一切都是異步的,我不得不使用$window訪問window.location.href來觸發頁面刷新,以便服務器處理路由。

所以我的問題,我可以混合觸發頁面角的html5Mode沒有打破後退按鈕刷新鏈接?這只是一個Webkit的bug,和/或有更好的方法來做到這一點?

理想情況下,我會讓應用程序運行Angular--但諸如「about」或「contact」頁面(不需要是動態或異步)的東西將直接從服務器使用常規頁面刷新...

幫助!

+1

現在,我找到了答案,我發現了一個重複的問題:http://stackoverflow.com/questions/11580004/angular-js-link-behaviour-disable-deep-linking-for-specific-urls – jlmakes 2013-05-03 13:58:56

回答

18

兩個選項:

  1. 如果您使用<a />標籤,指定target="_self"讓AngularJS知道它不應該捕捉他們的點擊(這些鏈接將瀏覽器通常處理)。這不是破解;這是正常的記錄行爲。
  2. 正如你一直在使用$window.location = 'foo'。這是可以接受的。
+4

選項1爲+1,用'html5Mode = true'修復webkit中的後退按鈕;我肯定在文檔中錯過了,謝謝Ezekiel! – jlmakes 2013-05-03 13:57:53

+0

Victor的解決方案有效。設置target="_self"強制頁面重新加載而不僅僅是路由。 – 2013-09-15 21:50:29

+0

謝謝!你一定能拯救我的生命! – 2014-01-16 14:31:14

相關問題