W przypadku aplikacji mediów społecznościowych mam kolekcję obiektów danych źródłowych, do których odwołują się ich identyfikatory, używając AngularFire 2
. Gdy każdy z tych identyfikatorów ma odpowiednie dane wyciągnięte z bazy danych, która przechowuje faktyczne obiekty kanału, chcę zaktualizować obiekt obserwowalny feedCards
za pomocą tych informacji, aby móc asynchronicznie wyświetlać kolekcję obiektów kanału w moim kodzie HTML. To dość mylący ciąg wydarzeń, więc pozwól mi podsumować go dla Ciebie.Ionic 3 - aktualizacja możliwa do zaobserwowania za pomocą danych asynchronicznych
Krok po kroku podejścia
displayFeed()
jest wywoływana tuż przedNavController
ładunku komponentfeed
na stronieMain
.displayFeed()
otrzymuje elementtwiner
, który jest zasadniczo elementem profilu użytkownika, a następnie przechowuje profil użytkownika w zmiennejuserProfile
.- Po załadowaniu profilu użytkownika globalna obserwowalna
feedCards
jest ustawiona naloadFeed()
, która zwraca tablicę obserwowalną. loadFeed()
używa wartościid
obiektu globalnegouserProfile
w celu załadowania listy referencji kanałów przechowywanych w profilu użytkownika.- Ta migawka jest następnie subskrybowana, a lokalna zmienna
feed
jest ustawiona na równi z listą wyników odniesień do pliku danych. loadFeed
zwraca obiekt obserwowalny, w którym lista referencyjnafeed
jest mapowana przez dane, z których składa się każde odniesienie do pliku danych.pullFeedData(number)
przyjmuje odwołanie do obiektu kanału informacyjnego i zwraca obserwowalny z powiązanymi danymi kanału.
co działa
alert(JSON.stringify(feedData));
alarmuje poprawnefeed
obiektówzasadzie wszystko.
co nie działa
feed.map(...
nie aktualizuje tablicę podawania ponieważpullFeedData(number)
naciągów i zwracafeedData
asynchronicznie. Tak więc,alert(JSON.stringify(data));
w alertach .
Kod
feed.ts
userProfile:any;
feed: FirebaseListObservable<any>;
feedData: FirebaseObjectObservable<any>;
feedCards: Observable<any[]>;
constructor(public db: AngularFireDatabase, public nativeStorage: NativeStorage) {}
displayFeed():void {
this.nativeStorage.getItem('twiner').then((res) => {
this.userProfile = res;
this.feedCards = this.loadFeed();
this.feedCards.subscribe((data)=>{
alert(JSON.stringify(data));
})
});
}
loadFeed():Observable<any[]> {
var feed;
this.feed = this.db.list('/twiners/' + this.userProfile.id + '/feed', { preserveSnapshot: true });
this.feed.subscribe((snapshots)=>{feed = snapshots});
return Observable.of(feed.map((snapshot) => {
this.pullFeedData(snapshot.val()).subscribe((feedData)=>{
alert(JSON.stringify(feedData));
return feedData;
});
})).delay(1000);
}
pullFeedData(twine:number):any {
return this.db.object('/twines/' + twine, { preserveSnapshot: true });
}
feed.html
<ion-content fullscreen scroll="true" overflow-scroll="true">
<ion-card *ngIf="feedCards | async">feedCards exist</ion-card>
<twine-feed-card *ngFor="let feedCard of feedCards | async"
[data]="feedCard"
></twine-feed-card>
</ion-content>
Podsumowanie
feed.map
nie aktualizuje feed
z obiektami kanału, ponieważ nowe dane są pobierane asynchronicznie. Potrzebuję poprawki.
Dziękujemy!
ty spróbuj uruchomić go wewnątrz stref ..? (Używałem listobservables, teraz używam emiterów zdarzeń, aby osiągnąć tę funkcję czasu rzeczywistego) –
@RajaYogan Czy pamiętasz, jak używać tej funkcji w strefach? Krótko mówiąc, nie wiem, co to jest. –
Brak problemów. Czy otrzymujesz dane tutaj w alarmie? this.feedCards.subscribe ((data) => { alert (JSON.stringify (dane)); }) –