2014-03-12 21 views
2

給出的模版爲我們的網址/foo的HTML包含以下內容:AngularJS:刪除hashbang反斜線不啓用html5mode

<a href="#bar" ng-click="myfunc()">Hello</a> 

我的期望是,這將直接我/foo#bar。相反,它導致我/foo#/bar,這是一個問題,因爲我需要使用值欄。現在我正在強行刪除斜線以獲得值欄,但這非常不合理。

我知道這是由於$ location和angularjs的路由機制。以下鏈接提供了一個解決方案,通常可以清除這個問題:AngularJS 1.1.5 - automatically adding hash tag to URLs

但是,啓用html5mode將我們其餘的鏈接搞砸了,因爲它似乎認爲我們使用的是單頁應用程序,而我們確實沒有。事實上,我們甚至沒有通過angularjs進行路由。

我正在尋找的所有方法都是從位置的散列中刪除斜線。這個問題有一個更簡單的解決方案嗎?

注意:欄可能是頁面內選項卡的名稱,也可能是您可以滾動到的div。我希望將其保留爲簡單的「#」語法,以便其他人在項目中工作。

回答

1

是的,角度確實假設您正在使用SPA,因爲angular是SPA的框架。因此,相對鏈接始終處理,就好像它們要進入不同的ng視圖,因此添加了/

我不知道是否有方法來關閉角度路由器,但替代方法是$location.hash()$anchorScroll()

我建議要做到這一點的最好辦法是把範圍的函數(rootScope如果使用錨很多)類似如下:

app.run(function($rootScope, $location, $anchorScroll){ 
    $rootScope.scrollTo = function(id){ 
    $location.hash(id); 
    $anchorScroll(); 
    } 
}); 

然後你的HTML應該是這樣的:

<a ng-click="anchorScroll('bar')">Hello</a> 
+0

這感覺有點過於頂部,以獲得相對較小的功能工作。此外,欄的值可能是一個選項卡(我會將其添加到原始問題),並且可能有多個函數用於ng-click。 – limasxgoesto0

+0

雖然它看起來只是你自己的應用程序的一小部分,但是'$ location'及其操作是angularJS框架的很大一部分。您選擇使用它的方式與設計不同,因此「撤消」有很多。 我不確定你對標籤的含義 - 在角度世界中,標籤視圖應該由指令處理。 如果你想嘗試更激烈的事情 - 嘗試閱讀是否有可能禁用'$ location'服務。 [這個問題](http://stackoverflow.com/questions/18611214/turn-off-url-manipulation-in-angularjs)是沿着正確的路線。 –