私はアプリケーション内で基本的な変化の検出に多くの苦労をしています。私は数日間このことをして意志を失ってしまった!ここの誰かが私に正しい方向を向けることができるのだろうかと思います。rxjs combineLatestとAnguar2は観測可能なアレイで検出を変更します
group
には2 user
のリストがあります。 1つはmembers
、もう1つはmoderators
です。
このメソッドは、データベースに接続して、それぞれ$key
値のオブジェクトのリストを取得します。ここでは、これらのキーを使用して各ユーザーの実際のUserData
を取得します。私はすべてを試して、combineLatest
が私が働くように思える唯一のものです。
したがって、両方とも関数を呼び出すと、テンプレートにasync
パイプを使用しています。
members$ = myService.getMemberListByType("blah", "members");
moderators$ = myService.getMemberListByType("blah", "moderators");
私の機能は次のようになります。
private getMemberListByType(groupKey: string, memberType: string) {
return this.af.database.list(`groups/${groupKey}/${memberType}`)
.switchMap(userListKeyMap => {
console.log("UserListKeyMap", memberType, userListKeyMap);
let usersObservables: Observable<UserData>[] = [];
userListKeyMap.forEach((object) => {
usersObservables.push(this.af.database.object(`users/${object.$key}`)
.map(UserData.fromJSON));
});
return Observable.combineLatest(usersObservables);
});
}
ただし、このリストの変更は次のように検出されません。他の場所の別の方法でmember
が削除され、moderator
に追加されたとします。この場合、リストmembers
は空のユーザーリスト[]
を発行しています。
My * ngIfと* ngForは、この新しい空のオブジェクトの変更を検出しません。その結果、(テンプレート上の)ユーザーは2つのリストの一部になりましたが、その下のデータはログによって強調されて完全に正確です。
私は、空の配列に結合すると、これが私の問題の原因だと感じます。何も放出することはできません....どのように角度の変化がありますか?私はそれを解決する方法を知らない。この「空の」ユースケースにcombineLatestの代替手段がありますか?私はasync
パイプを使用しているので、意味があることが必要です。
誰かが私の問題を明るく照らすことができますか?
ありがとうございました!
更新
私はこの問題は、angular2が空の観察可能なリストを検出しないとです確信しています。 Observable Arrayに値があるが、後でその値が空になる場合Angular2は空の配列を表示しません。私はこの時点でこの問題を解決する方法がありません。私のアプローチが間違っているか、空の観測可能リストを登録するために何か具体的なことが起こる必要がありますか?
- 青=コンポーネントの負荷状態が良好で、ユーザがメンバーでした。
- 緑色=ユーザーはメンバーから管理者/モデレーターに移動しました。
- 赤=これは存在しないので、なぜまだ表示されていますか?
private getMemberListByType(groupKey: string, memberType: string) { return this.af.database.list(`groups/${groupKey}/${memberType}`) // Force the source obs to complete to let .toArray() do its job. .take(1) // At this point, the obs emits a SINGLE array of ALL users. .do(userList => console.log(userList)) // This "flattens" the array of users and emits each user individually. .mergeMap(val => val) // At this point, the obs emits ONE user at a time. .do(user => console.log(user)) // Load the current user .mergeMap(user => this.af.database.object(`users/${user.$key}`)) // At this point, the obs emits ONE loaded user at a time. .do(userData => console.log(userData)) // Transform the raw user data into a User object. .map(userData => User.fromJSON(userData)) // Store all user objects into a SINGLE, final array. .toArray(); }
注:
は、あなたがこの回答をhttp周りを見て持ってお勧め:// stackoverflowの.com/questions/41584409/change-detection-in-angular-2/41585545#41585545 – Aravind
チームビューアでご利用いただけますか? – Aravind