尝试替换 $location.search 时如何避免转义?
How to avoid escaping when trying to replace $location.search?
const createParam = (key, value) => '?'+key+'='+value;
const rebuildUrl = (linkUrl, params) => {
TagsFactory.resetTickerTags();
console.log('params', params);
_.each(params, (param)=> {
linkUrl += createParam(param.key, param.value);
});
console.log('linkUrl', linkUrl);
// window.location.href = linkUrl;
$location.search(linkUrl);
};
const checkForStoredLink = () => {
Util.notEmpty(storedLinkParams) ? rebuildUrl('', storedLinkParams) : null;
};
storedLinkParams = [
{ key: "ticker",
value: "AAPL" },
// etc...
我上面的函数将接收参数数组并生成如下字符串:
/dashboard?ticker=AAPL?sort=trend?timespan=day?term_id_1=3010695?start_epoch=1473186060?end_epoch=1473358860
我现在的 URL 是这样的:
http://localhost/static/dashboard/app/#/dashboard?
一旦我上面的函数到达 $location.search
行,它最终看起来像这样,这打破了 UI:
http://localhost/static/dashboard/app/#/dashboard?%3Fticker=AAPL%3Fsort%3Dtrend%3Ftimespan%3Dday%3Fterm_id_1%3D3010695%3Fstart_epoch%3D1473186060%3Fend_epoch%3D1473358860
$location.search
期望搜索参数由 &
分隔。例如
$location.search('param1=value1¶m2=value2');
结果:?param1=value1¶m2=value2
$location.search('?param1=value1?param2=value2')
结果:?%3Fparam1=value1%3Fparam2
。
如果你开始使用 &
来分隔参数,那么你的生活会更简单,你可以传入一个 object 并避免任何字符串构建:
$location.search(_.fromPairs(_.map(params, x => [x.key, x.value])));
上面的代码假定 _
是 lodash.js 的最新版本,如果不是:
_.each(params, x => $location.search(x.key, x.value));
回答标题中的问题:如果你真的想自己设置原始 url,那么解决方案可能是在 [=20= 周围注入你自己的包装器],但不推荐
const createParam = (key, value) => '?'+key+'='+value;
const rebuildUrl = (linkUrl, params) => {
TagsFactory.resetTickerTags();
console.log('params', params);
_.each(params, (param)=> {
linkUrl += createParam(param.key, param.value);
});
console.log('linkUrl', linkUrl);
// window.location.href = linkUrl;
$location.search(linkUrl);
};
const checkForStoredLink = () => {
Util.notEmpty(storedLinkParams) ? rebuildUrl('', storedLinkParams) : null;
};
storedLinkParams = [
{ key: "ticker",
value: "AAPL" },
// etc...
我上面的函数将接收参数数组并生成如下字符串:
/dashboard?ticker=AAPL?sort=trend?timespan=day?term_id_1=3010695?start_epoch=1473186060?end_epoch=1473358860
我现在的 URL 是这样的:
http://localhost/static/dashboard/app/#/dashboard?
一旦我上面的函数到达 $location.search
行,它最终看起来像这样,这打破了 UI:
http://localhost/static/dashboard/app/#/dashboard?%3Fticker=AAPL%3Fsort%3Dtrend%3Ftimespan%3Dday%3Fterm_id_1%3D3010695%3Fstart_epoch%3D1473186060%3Fend_epoch%3D1473358860
$location.search
期望搜索参数由 &
分隔。例如
$location.search('param1=value1¶m2=value2');
结果:?param1=value1¶m2=value2
$location.search('?param1=value1?param2=value2')
结果:?%3Fparam1=value1%3Fparam2
。
如果你开始使用 &
来分隔参数,那么你的生活会更简单,你可以传入一个 object 并避免任何字符串构建:
$location.search(_.fromPairs(_.map(params, x => [x.key, x.value])));
上面的代码假定 _
是 lodash.js 的最新版本,如果不是:
_.each(params, x => $location.search(x.key, x.value));
回答标题中的问题:如果你真的想自己设置原始 url,那么解决方案可能是在 [=20= 周围注入你自己的包装器],但不推荐