2017-09-25 24 views
1

我正在将现有的角度4应用程序从PathLocationStrategy迁移到HashLocationStrategy,并且需要保持入口点url的正常工作。它看起来像www.test.com/?param1=123HashLocationStrategy和角度为4的查询参数

问题是,只要我切换到HashLocationStrategy,查询参数不能通过activatedRoute.queryParams访问。 (www.test.com/#/?param1=123工作正常,但我需要保留原始的URL条目以及)

那么有没有办法从www.test.com/?param1=123获得param1值与HashLocationStrategy?我真的不想创建一个空的着陆页,将重定向到www.test.com/#/?param1=123,除非我无法避免它。

+0

路由更改通常意味着旧的网址将被重定向到新网址,所以是的,总的来说,从服务器端执行此操作是有意义的。不仅可以有像'/?param1 = 123'这样的传统根路径,而且还可以有像'/ foo/bar'这样的其他路径,对吧?使用HashLocationStrategy通常意味着该应用程序不是SPA。是吗?像'/?param1 = 123#/?param1 = 456'这样的URL在理论上可以存在,所以它取决于这应该如何处理。 – estus

+0

我只关心入口网址,其余的网址并不重要,可以更改。移动HashLocationStrategy的原因是我们已经获得了S3存储桶提供的SPA,并且为Angular创建的Url添加服务器端支持变得棘手。服务器端重定向不适用于url中的# – Leo

+0

它运行良好。从服务器端读#有问题,但没有设置它的问题。在Angular中可以做到这一点,但我认为从服务器端来说它更加干净。当currentUrl不是'/'时,你可以将Location头部设置为''/#'+ currentUrl',它将覆盖所有的SPA URL。 – estus

回答

0

由于HashLocationStrategy已经作为默认,PathLocationStrategy应该为了得到真正的浏览器的位置额外注入:

providers: [ 
    PathLocationStrategy, 
    {provide: LocationStrategy, useClass: HashLocationStrategy}, 
    ... 
    ] 

... 

class AppComponent { 
    constructor(router: Router, pathLocationStrategy: PathLocationStrategy) { 
    const basePath = pathLocationStrategy.getBaseHref(); 
    const absolutePathWithParams = pathLocationStrategy.path(); 

    if (basePath !== absolutePathWithParams) { 
     router.navigateByUrl(absolutePathWithParams); 
    } 
    } 
} 

如果基本URL,应该采取另外从路径了。

+0

由于某种原因无法得到这个工作。只要我将HashLocationStrategy定义为默认值('imports:[RouterModule.forRoot(routes,{useHash:true})],')basePath和absolutePathWithParams都是空字符串。 – Leo

+0

我无法证实这一点。正如你在这里可以看到的那样,它可以按预期工作,即使在闯入者http://plnkr.co/edit/rEWLGykANUMReFqNVPno?p=preview – estus

+0

哦,非常感谢蹲点者。我想我应该在AppComponent中做重定向,而我试图在路由上设置一个单独的组件。 – Leo