这是相当棘手的,因为同样有很多未解决的问题。
git 中的一个这样的问题 - https://github.com/angular/angular/issues/12347
要么您必须为每种类型的查询参数提供可选路由,例如
const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: ':product', component: ProductComponent, resolve: { product: ProductResolver } },
{ path: ':product/:card', component: ProductComponent, resolve: { product: ProductResolver } },
{ path: ':product/:group/:card', component: ProductComponent, resolve: { product: ProductResolver } }];
或者您可以查看我在 github 上的一个要点中找到的这段代码。您可以在路由器中使用解析。获取参数并检查。
相同的链接 - https://gist.github.com/e-oz/5a95f50336e68623f9e0
export class UrlParser
{
getParameter(key) {
return this.getParameters()[key];
}
getParameters() {
// http://stackoverflow.com/a/2880929/680786
var match,
pl = /\+/g, // Regex for replacing addition symbol with a space
search = /([^&=]+)=?([^&]*)/g,
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); },
query = window.location.search.substring(1);
let urlParams = {};
while (match = search.exec(query)) {
urlParams[decode(match[1])] = decode(match[2]);
}
return urlParams;
}
setParameter(key:string, value) {
let params = this.getParameters() || {};
if (params[key]==value) {
return true;
}
params[key] = value;
let search = [];
for (let k in params) {
if (params.hasOwnProperty(k)) {
search.push(encodeURIComponent(k)+"="+encodeURIComponent(params[k]));
}
}
let query = '?'+search.join('&');
let history = DOM.getHistory();
if (history && history.replaceState) {
history.replaceState(null, '', location.pathname+query);
} else {
return false;
}
return true;
}
}
更新
我认为它已在 GIT 上的一张票中提到的新路由器中得到处理 - https://github.com/angular/angular/issues/3525
现在可选路线由localhost:3000/heroes;id=15;foo=foo
";"
.
id 值在 URL 中显示为 (;id=15;foo=foo),而不是在 URL 路径中。“英雄”路线的路径没有 :id 标记。
可选路由参数不以“?”分隔 和“&”,就像它们在 URL 查询字符串中一样。它们用分号“;”隔开 这是矩阵 URL 表示法——您以前可能没有见过。
看看这个链接可能会有所帮助 - https://angular.io/guide/router#route-parameters-required-or-optional