如何在尝试替换$location.search时避免转义

How to avoid escaping when trying to replace $location.search?

本文关键字:search 转义 location 替换      更新时间:2023-09-26
 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...

上面的函数将接受params数组并生成一个像这样的字符串:/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&param2=value2'); result: ?param1=value1&param2=value2

$location.search('?param1=value1?param2=value2')导致:?%3Fparam1=value1%3Fparam2

如果你开始使用&来分隔参数,那么你的生活可以更简单,你可以传入一个对象,避免任何字符串构建:

$location.search(_.fromPairs(_.map(params, x => [x.key, x.value])));

JsFiddle例子

以上代码假设_是lodash.js的最新版本,否则:

_.each(params, x => $location.search(x.key, x.value));

JsFiddle例子

回答标题中的问题:如果您真的想自己设置原始url,那么解决方案可能是在window.location周围注入您自己的包装器,但不建议