如何在Angular 5中创建/更新ParamMap?

时间:2018-02-19 16:46:09

标签: angular angular5 angular-router

在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中的一个错误,但我在寻找替代方案或解决方法,直到它得到修复。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我不太确定这是最好的方式,但它对我有用。

而不是Object.create(null) as Params,我正在创建这样的初始值:

const initialValue = Object.create((this.routeParams as any).params.__proto__);

这会创建一个“空”对象,其原型与原始的params对象的原型匹配,因此在调用convertToParamMap函数后,生成的ParamMap实例的内部{{1} } object有params方法。

就个人而言,我不喜欢从包含它们的对象外部调用私有成员,但是这样可行,所以我将使用它直到有更好的选择出现。