如何将@ ngrx / store语法用法从2.2.1版升级到6.1.2版

时间:2018-12-15 12:27:08

标签: angular ngrx

如何将@ ngrx / store语法用法从2.2.1版升级到6.1.2版

最近我将Angular项目从Angular ^ 2.0.0升级到Angular ^ 6.0.0和相关的npm插件。但是,我对@ngrx/storeimmutable的用法不熟悉。项目升级后,应用基本正常。但是以下代码将引发错误:can not read get of undefined

import { Store } from '@ngrx/store';

// .....

    this.modifyState$ = store.select('suitablyInfoModify');
    this.client$ = this.modifyState$.map(data => data.get('client'));

// works on @ngrx/store v2.2.1, immutable v3.8.1
// errors on @ngrx/store v6.1.2, immutable v3.8.2

它显示@ngrx/storedata功能中没有转移map。变量data现在为undefined

那么,如何修改此部分才能使其正常工作?并希望与原始代码兼容。

2 个答案:

答案 0 :(得分:2)

如果您导航到ngrx monorepo on github,则可以通过单击“分支:主”按钮(位于绿色的“克隆或下载”按钮的最左侧)来查看以前版本的所有文档,然后选择“标签”标签>单击与您感兴趣的应用版本相关的标签。这将向您显示该版本的存储库,然后您需要导航至商店的文档(我认为可能是已经在版本之间的仓库中移动了。

不幸的是,回购在版本2和版本4(没有版本3)之间进行了更改,因此他们那里没有版本2文档(我不确定它在哪里)。不过,如果您将第4版的文档与第6版的ngrx / store的文档进行比较,希望可以帮助您了解发生了什么变化。

一项更改:rxjs移至lettable operators。我不确定他们是否仍然在angular版本6中使用observable.operator()语法,但是在更高版本中,您肯定需要使用observable.pipe(operator())的lettable运算符语法。

ngrx/store中,新语法为store.pipe(select()),您需要分别导入每个运算符。

this.modifyState$ = store.pipe(select('suitablyInfoModify'));
this.client$ = this.modifyState$.pipe(map(data => data.get('client')));

另外,除非您的'suitablyInfoModify'归约器返回的数据是类或对象,否则将没有与之关联的get()方法。通常(在我见过的所有示例中),ngrx reducer返回简单的数据(例如json)。不过,这不是必需的,因此您的reducer肯定可以返回类实例。

另外,我不记得Angular 6是否使用rxjs 6,但是rxjs 6还引入了许多其他更改。如果可以的话,现在升级到rxjs 6(无论如何已经在进行升级过程中)将使您的生活更轻松。

答案 1 :(得分:0)

已解决!

实际上,问题是由StoreModule配置引起的:

@NgModules({
  imports: [
    // ...
    // previous i wrote like this
    StoreModule.forRoot(reducer)
  ]
})

,以便在商店预订中,数据始终为undefined

经过一天的研究,我终于找到了该错误,并已对其进行修复:

@NgModules({
  imports: [
    // ...
    // fix it
    StoreModule.forRoot({
      suitablyInfoModify: reducer,
    })
  ]
})

哈哈,终于〜

感谢@John的回答,这对我也有帮助!