Javascript 角度4:can';t更新URL的查询字符串

Javascript 角度4:can';t更新URL的查询字符串,javascript,angular,typescript,query-string,Javascript,Angular,Typescript,Query String,我有一个带有几个过滤器的搜索表单。它们分布在文本输入、复选框和收音机按钮中。与这些过滤器的每次交互都必须更新URL的查询字符串 我也可以有以下情况: 将转换为如下数组:myFilter=['1','2','3'] 更新查询字符串的代码如下所示: this.router.navigate([], {queryParams: myNewQueryString, relativeTo: this.routerActive}); 其中,“this.router”是ActivatedRoute的实例,

我有一个带有几个过滤器的搜索表单。它们分布在文本输入、复选框和收音机按钮中。与这些过滤器的每次交互都必须更新URL的查询字符串

我也可以有以下情况:

将转换为如下数组:myFilter=['1','2','3']

更新查询字符串的代码如下所示:

this.router.navigate([], {queryParams: myNewQueryString, relativeTo: this.routerActive});
其中,“this.router”是ActivatedRoute的实例,“myNewQueryString”是包含查询字符串的新参数的对象。这段代码所做的是将路由重定向到自身并更新查询字符串

在使用新过滤器更新查询字符串之前,我需要确保不会丢失已经是URL一部分的其他过滤器。因此,我需要做的是读取查询字符串,进行所需的更改,然后将值返回到URL

要读取查询字符串,我使用以下代码:

const currentQueryString: any = this.routerActive.snapshot.queryParams;
从那时起,我可以开始进行所需的更改并继续,但问题是,通过尝试更改此对象的属性,Angular会给我以下错误:

TypeError:无法分配给对象的只读属性“parameter”

发生此错误的原因是:

this.routerActive.snapshot.queryParams
都是只读的,所以我不能直接对它们进行修改。我需要做的是将属性复制到新对象,如下所示:

const newQueryString: any = {};

for (const key in currentQueryString) {
    if (currentQueryString.hasOwnProperty(key)) {
        newQueryString[key] = currentQueryString[key];
    }
}
现在我有了当前查询字符串的副本,可以对其进行修改。问题是,当数组中有多个值时,查询字符串不会得到更新。它仅更新第一个值

这是虫子吗?有没有更好的方法

我正在编写的完整代码如下:

//query is an object like: { 'param' : 'value' }
updateQueryString(query: any): void {
    const currentQueryString: any = this.routerActive.snapshot.queryParams;
    const newQueryString: any = {};

    //Copy the current query string
    for (const key in currentQueryString) {
        if (currentQueryString.hasOwnProperty(key)) {
            newQueryString[key] = currentQueryString[key];
        }
    }

    // Apply the new filter to the copy of the query string
    for (const key in query) {
        if (query.hasOwnProperty(key)) {
            if (newQueryString[key] instanceof Array) {
                newQueryString[key].push(query[key]);
            } else {
                const filter = [];
                filter.push(query[key]);
                newQueryString[key] = filter;
            }
        }
    }

    this.router.navigate([], {queryParams: newQueryString, relativeTo: this.routerActive});
    this.search(newQueryString);
 }

我还需要在这个函数中进行其他验证,但现在我只想对URL进行更改。我将每个参数视为一个数组,因为我可以使用我在本问题开头提到的场景。

问题似乎是在从当前查询字符串复制到新查询字符串的过程中出现的。出于某种原因,我们需要提供一个新的数组实例,以便Angular能够理解更改并将其应用于URL

要提供此新实例,我们可以更改:

这:

为此:

newQueryString[key] = Array.from(currentQueryString[key]);
通过创建一个新的数组实例,问题得到了解决,我需要的更改现在反映在URL上

要使这个read-copy-change-apply-query-string过程正常,还需要其他几个验证,但我认为,一旦问题出在如何处理ActivatedRoute提供的实例上,这些细节就不太相关了

若有人遇到这样的问题,显然只要处理对象的新实例就可以了

newQueryString[key] = Array.from(currentQueryString[key]);