2017-02-28 56 views
0

我已經開始看到有關Angular2的一些信息,特別是UI路由器狀態和路由。我注意到的是,與Ang1相反,我不得使用'#'字符以便從路線導航到另一個路線。 這意味着,如果我進入狀態foo,其路由爲/foo,我已經到類型:爲什麼UI-Router停止使用哈希字符?

mydomain.com/app/foo

,而不是舊mydomain.com/app /#/ foo

這顯然啓動了一個HTTP請求到服務器中的url /foo。在Ang1響應當然會是一個404(除非我以前創建一個靜態鬼頁面,例如爬蟲),但與Ang2我得到相同的HTML(index.html),我要求:

mydomain。 com/app/

這基本上是一個「加載....」頁面。

我想知道的是,這是如何可能的,如果這與新一代框架提供的服務器端渲染功能相關聯。

謝謝

回答

1

由於HTML5客戶端的路由是可能的,而無需使用「#」。
使用此HTML5模式,也有可能在AngularJS,但你需要啓用它:

$locationprovider.html5Mode(true) 

在角(版本2.X.X和更大的)但是,HTML5模式是默認啓用的。
如果你想使用它,你需要知道兩件事:
- 並非所有的瀏覽器都支持該模式。
- 服務器需要支持HTML5模式

如果您仍然想使用「#」,則需要啓用它。要做到這一點,下面的提供程序添加到您的根NgModule

{ provide: LocationStrategy, useClass: HashLocationStrategy } 
1

看一看HashLocationStrategyuseHash: true RouterModule.forRoot(routes, { useHash: true })

沒有哈希使用HTML pushState

您對每種產品的優點和缺點的總結很不錯。當使用pushState(而不是useHash)時,你的服務器必須正確處理路由,但是你的路由看起來更乾淨。這是一個權衡。

爲了更清楚地瞭解服務器處理,如果您希望能夠爲除根之外的任何路由(例如/app/foo)添加書籤並稍後返回(例如,從刷新或新瀏覽器或標籤)。使用useHash: false(pushState),您的服務器必須專門配置爲映射這些路由,併爲這些情況正確提供客戶端。但是,使用useHash: true時,不需要這種特殊的服務器端處理;你只有一個服務器端點,即根目錄;按照Web標準,哈希片段完全由瀏覽器處理。

+0

對不起,但我沒有得到如何服務器與此有關。據我瞭解pushState不會觸發任何頁面重新加載,所以我怎麼可能看到頁面的請求? – Nemus

+1

爲了澄清,如果您希望能夠爲除根之外的任何路由(例如'/ app/foo')添加書籤並稍後返回(例如,從刷新或新瀏覽器或選項卡),則區別適用。使用'useHash:false'(pushState),您的服務器將不得不專門配置爲映射這些路由,併爲這些情況正確提供客戶端。但是,使用'useHash:true',不需要這種特殊的服務器端處理;你只有一個服務器端點,即根目錄;按照Web標準,哈希片段完全由瀏覽器處理。 – Will