2017-02-28 19 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