トピックは多分理解できます。同期データとして必要なときにRxJS Observablesを正しく動作させる方法
私はかなり新しいRxJS
とRedux
世界です。私はObservables
とNgRX store
とAngular 2+アプリに取り組んでいます。
私はさまざまな部分があります。ここで私が必要とするのは、あるスライスからプロパティを取得し、異なるプロパティを持つAssetFile
オブジェクトのArray
を受け入れるdownloadService
に渡すことです。
constructor(
private store: Store<AppState>,
private downloadService: DownloadService) {
this.selectedAssets$=this.store.select('selectedAssets')
this.selectedAssets$.subscribe(asset => this.assetsSelected = asset)
}
私はその部分を正しく実行したかどうかはわかりません。 UIで、選択されたAssetがStore.selectedAssetsにディスパッチされたとき。ここではthis.selectedAssets $に割り当て、選択したオブジェクトの配列であると仮定する別の変数this.assetsSelectedを作成します。
次に、ファイルをダウンロードするための準備をする機能があります。それぞれの資産はassetFiles
という種類のプロパティを持っています。最後にFile[]
のタイプがありますが、そのうちのArray
が必要です。
prepareFilesToDownload(){
let files = []
let preparedFiles = this.assetsSelected.map(asset => {
asset.assetFiles.map(file=>{
files.push(file)
})
})
return files
}
このコードは動作しますが、私はそれがこのようなことを行うための適切な方法ではないと信じています。私はちょっと失った。
たぶん私は少ないコードと直接Observable
this.selectedAssets$=this.store.select('selectedAssets')
からUPDATEでこの結果を達成することができます:ここで
constructor(
private store: Store<AppState>,
private downloadService: DownloadService) {
this.selectedAssets$=this.store.select('selectedAssets')
}
私は、単一のアレイに配列の配列を組み合わせることRamda
からflatten
方法を使用していました。
prepareFilesToDownload(){
let files
this.selectedAssets$.subscribe(
assets => {
files = R.flatten(assets.map(asset => asset.assetFiles.map(file => file)))
}
).unsubscribe();
return files
}
Observablesを使用する適切な方法であるかどうかは少し良くなりますが、まだわかりません。私は、RxJS演算子を使って観測できるthis.selectedAssets$
からこの配列をまっすぐに返す方が良いと思います。しかし、そうする正しい方法を見つけることができません。
片側の質問です。 2番目の例のように.subscribe
と.unsubscribe
が正しいですか、代わりに.take(1)
を使用できますか?
私はNgRXに慣れていませんが、リソースを解放してメモリリークを防ぐために.unsubscribe()を使用しています。これは通常、ngOnDestroy()ライフサイクルフックから呼び出されます。 Observable usageの概要はhttps://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-serviceにあります。 – David