我已经开始看到一些关于Angular2的东西,特别是UI-路由器状态和路由。我注意到的是,与Ang1相反,现在我不能使用'#'字符来从一条路线导航到另一条路线。这意味着,如果我转到状态foo (它被路由为/foo ),我必须键入:
mydomain.com/app/foo
而不是原来的mydomain.com/app/#/foo
这显然启动了对服务器中的url /foo的HTTP请求。当然,在Ang1中,响应将是404 (除非我以前创建了一个静态的幽灵页面,例如用于爬虫),但是使用Ang2,我得到了与我所要求的相同的html ( index.html):
mydomain.com/app/
基本上就是“装载.”页面。
我想了解的是,这是如何实现的,如果这与新一代框架提供的服务器端呈现功能相关联的话。
谢谢
发布于 2017-02-28 17:08:55
因为HTML5客户端路由是可能的,无需使用"#“。
在AngularJS中也可以使用这种HTML5 5模式,但您需要启用它:
$locationprovider.html5Mode(true) 然而,在角( 2.X.X版及更高版本)中,默认启用HTML5 5模式。
如果你想使用它,你需要注意两件事:
如果您仍然想使用"#",则需要启用它。为此,将以下提供程序添加到根NgModule:
{ provide: LocationStrategy, useClass: HashLocationStrategy } 发布于 2017-02-28 17:11:08
看看HashLocationStrategy和useHash: true:RouterModule.forRoot(routes, { useHash: true })
如果没有散列,则使用pushState。
你对每一个优点和缺点的总结都是很好的。当使用pushState (而不是useHash)时,您的服务器必须正确地处理这些路由,但是您的路由看起来更干净。这是一种交换。
为了更具体地了解服务器处理,如果您希望能够对根(如/app/foo)以外的任何路由进行书签并在以后(例如,从刷新或新浏览器或选项卡)返回,则应用这种区别。使用useHash: false (pushState),您的服务器必须进行特殊配置,以映射这些路由,并为这些情况正确地为客户端提供服务。但是,对于useHash: true,不需要这样特殊的服务器端处理;您将只有一个服务器端端点,即根;散列片段完全由浏览器按照web标准处理。
https://stackoverflow.com/questions/42514472
复制相似问题