2014-09-26 43 views
2

在我們向用戶發送電子郵件,我們包括像以下鏈接角應用:角:重定向/#%21 /至/#/

http://example.com/#!/mypage 

我們注意到,一些電子郵件客戶端或瀏覽器,對於某種原因,用戶點擊後引導用戶到這個代替:

http://example.com/#%21/mypage 

角,然後引發以下錯誤:

Uncaught Error: [$location:ihshprfx] Invalid url "http://example.com/#%21/mypage", missing hash prefix "#!". 
http://errors.angularjs.org/1.3.0-beta.10/$location/ihshprfx 

我們使用的是$locationProvider.hashPrefix('!');。我試圖找到一種方法來檢測$location/#%21/而不是/#!/,然後正確重定向,但我找不到方法來檢測和/或讓Angular做到這一點。什麼是正確的方法來做到這一點?

回答

1

在此處結束找到一個更好的答案:

Adding a hash prefix at the config phase if it's missing

使用$locationChangeStart沒有工作,因爲角度扔在初始化過程中的錯誤,所以$locationChangeStart從未被絆倒。

相反,我用下面的方法去:

<head> 
    <!-- Change #%21 to #! on first load --> 
    <script type="text/javascript"> 
     var loc = window.location.href; 
     if (loc.indexOf('#%21') > -1 && loc.indexOf('#!') === -1) { 
      window.location.href = loc.replace("#%21", "#!"); 
     } 
    </script> 

<!-- More stuff ... --> 
</head> 
<body>... 

這(一)讓我重寫URL之前我們曾經打角,以及(b)可確保我們只把它改寫了第一次應用程序被加載,而不是任何時候存在位置更改 - 以防萬一在將來的某個時刻,我們會故意寫入包含#%21的更改。

0

可能不是解決問題的最優雅方式,但您可以捕獲$locationChangeStart事件,然後根據URL的性質,有條件地將用戶重定向到$location服務。

例如:

$rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) { 
    // ... 
}); 
+0

這實際上不起作用 - 第一次加載頁面時,angular會在觸發'$ locationChangeStart'之前拋出錯誤 – jdotjdot 2014-10-07 04:40:50