如何将@ ngrx / store语法用法从2.2.1版升级到6.1.2版
最近我将Angular项目从Angular ^ 2.0.0升级到Angular ^ 6.0.0和相关的npm插件。但是,我对@ngrx/store
和immutable
的用法不熟悉。项目升级后,应用基本正常。但是以下代码将引发错误: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/store
在data
功能中没有转移map
。变量data
现在为undefined
。
那么,如何修改此部分才能使其正常工作?并希望与原始代码兼容。
答案 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的回答,这对我也有帮助!