2016-04-26 69 views
3

我试图创建漂亮的网址,例如:http://localhost/data/2016.05/mike 这里我试图在URL中传递3个参数:["2016.05", "mike"]
我创建相应的路由器配置:如果参数值包含点(点),Angular2路由器无法正常工作

{ path: '/data/:date/:userName', component: DataDetails, name: 'DataDetails' } 

该路由器可以让我通过调用像访问从我的程序该网址:

this._router.navigateByUrl('/data/' + $data.year + '.' + data.month + '/' + data.userName); 

之后,我能找回我的参数里面有DataDetails组件。

只要我尝试直接从浏览器访问此链接(不首先访问主页),就会出现问题。只需转到网址:http://localhost/data/2016.05/mike。当我从2016.05删除点.

Cannot GET /data/2016.05/mike 

正常工作: 我收到一个错误。

有没有问题,为什么我不能使用.作为路由器参数值?

回答

1

我不知道是否有一个特定的原因,不允许.,但我想它只是不想添加到允许的字符列表。

/=最近https://github.com/angular/angular/pull/7312加入到被允许作为参数值的一部分,而不是作为分隔符。

值得创建一个错误报告。

+1

谢谢。我已经为Angular 2打开了相应的问题:https://github.com/angular/angular/issues/8249。让我们看看官方的回应。 – WhiteAngel

1

点是不允许的,因为当你想为一个文件,例如yourserver它用于:8080/mypic.png

0

***不覆盖,只需要使用URLSearchParams

let body = new URLSearchParams(); 
body.set('username', username); 
body.set('password', password); 
  • 角DOC

    这类接受的$ {@链路QueryEncoder}, 这是一个可选的第二参数用于在发出请求之前序列化参数。默认情况下, QueryEncoder使用encodeURIComponent, 对参数的键和值进行编码,然后根据IETF RFC 3986:https://tools.ietf.org/html/rfc3986对允许成为查询 的一部分的某些字符进行解码。

    这些是不被编码的字符:! $ \' () * + , ; A 9 - . _ ~ ? / *

    • 如果所述一组允许的查询字符不是特定的后端上可接受的,
    • QueryEncoder可以被子类和作为第二参数设置到URLSearchParams。

    覆盖URLSearchParams使用自己的方法来编码不在上面的列表中的字符。

// **********

import {URLSearchParams, QueryEncoder} from '@angular/http'; 
class MyQueryEncoder extends QueryEncoder { 
    encodeKey(k: string): string { 
    return myEncodingFunction(k); 
    } 

    encodeValue(v: string): string { 
    return myEncodingFunction(v); 
    } 
} 

let params = new URLSearchParams('', new MyQueryEncoder()); 
0

您使用的WebPack。在webpack中,我们可以通过在webpack dev服务器配置文件中做一些小改动来使其工作。

historyApiFallback: { 
     disableDotRule: true 
    },