在Angular 5中,Router / ParamMap对象是不可变的。它可以从路径中检索并在组件中使用。但是,我有一个用例,修改ParamMap会很方便(并且它在Angular 4中运行良好)。
以前,我使用convertToParamMap
函数将Object
转换为ParamMap
。自从更新到Angular 5后,生成的ParamMap
对象的私有params
成员会丢失其原型,并在调用生成的ParamMap
{{1}时生成错误方法。
.get(key)
const params = this.routeParams.keys.reduce(
(pv: Params, cv) => {
pv[cv] = this.routeParams.get(cv); // <- Error on second call
return pv;
},
Object.create(null) as Params
);
params["changedKey"] = newValue;
this.routeParams= convertToParamMap(params);
最初是通过调用this.routeParams
实例的ActivatedRoute
方法填充的,只需将我的组件的queryParamMap
成员设置为已返回routeParams
实例。
在我第一次通过上面的代码时,一切正常。在第二次传递中,在我使用ParamMap
函数更新routeParams
成员后,我收到此错误:
convertToParamMap
通过调试器,Object doesn't support property or method 'hasOwnProperty'
调用在内部调用.get(cv)
方法,然后调用.has(cv)
(this.params.hasOwnProperty(name)
= this
个对象和ParamMap
= name
)。我认为这是Angular 5中的一个错误,但我在寻找替代方案或解决方法,直到它得到修复。
有什么建议吗?
答案 0 :(得分:0)
我不太确定这是最好的方式,但它对我有用。
而不是Object.create(null) as Params
,我正在创建这样的初始值:
const initialValue = Object.create((this.routeParams as any).params.__proto__);
这会创建一个“空”对象,其原型与原始的params
对象的原型匹配,因此在调用convertToParamMap
函数后,生成的ParamMap
实例的内部{{1} } object有params
方法。
就个人而言,我不喜欢从包含它们的对象外部调用私有成员,但是这样可行,所以我将使用它直到有更好的选择出现。