Im, создавая приложение Ionic 2, и когда приложение загружается, оно должно показывать пользователей рядом с вами, что работает, но оно показывает повторяющиеся значения. Я понимаю, что это может быть частью поведения как он показывает начальные значения, а затем что будет дальше? Есть ли способ показать значения после того, как все загружено. В моей голове это должно работать как массив, который заполняется тогда, и только тогда он отображает либо это, либо он должен поместить записи, поскольку он заполняетRXJS Поведение Тема вывода Дубликаты при первой загрузке
Вот мой Service.ts, который толкает пользователь к компоненте с помощью следующей
import { Injectable, NgZone } from '@angular/core';
import { Geolocation, Geoposition, BackgroundGeolocation } from 'ionic-native';
import { Fb } from './firebase';
import { Observable } from 'rxjs/Observable';
import {Subject} from 'rxjs/Subject';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
import { User } from './user';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/share';
import 'rxjs/add/operator/map';
import 'rxjs/Rx';
declare var GeoFire: any
@Injectable()
export class LocationTracker {
public firebaseRef: any;
public geoFire: any;
public subject: Subject<any> = new BehaviorSubject(0);
constructor(public zone: NgZone, public fire:Fb, public user:User) {
this.firebaseRef = this.fb.ref('geofire');
this.geoFire = new GeoFire(this.firebaseRef);
}
UsersNearME() : Observable<any> {
this.nearme.length = 0;
let geoQuery = this.geoFire.query({
center: [this.lat, this.lng],
radius: 4.609 //kilometers
});
geoQuery.on("key_entered", (key, location, distance) => {
const sender = this.fb.ref('/users/'+ key );
sender.on('value', (snapshot) => {
const profile = snapshot.val().profile;
this.nearme.push({
userid: key,
userloc: location,
});
this.subject.next(this.nearme);
//
});
});
return this.subject.asObservable();
}
}
Моего Component.ts выглядит следующим образом и в основном подписывается на услугу пользователей
import { Component, NgZone, ChangeDetectorRef, Inject, OnInit } from '@angular/core';
import 'rxjs/Rx';
@Component({
selector: 'members',
templateUrl: 'members.html'
})
export class MembersOverviewPage implements OnInit {
public usersNearMe;
constructor(locationTracker: LocationTracker,
zone: NgZone,) {
}
ngOnInit() {
this.zone.run(() => {
setTimeout(() => {
try {
this.locationTracker.UsersNearME().filter(data => data != null).subscribe(data => {
if(data) {
this.usersNearMe = data;
this.loader.dismiss();
}
}, (error) => {
alert("are you online ? ");
},() => {
// this.loader.dismiss();
});
} catch (e) {
console.log(" error "+ JSON.stringify(e));
}
}, 1000);
});
}
}
Похоже, проблема заключается в том, как вы создаете массив 'this.nearme'. Вы нажимаете на него пользователя, затем вы испускаете. Вы нажимаете другое значение, затем вы испускаете. Не лучше ли было бы получить всех близких пользователей **, а затем ** испустить массив ОДИН РАЗ? – AngularChef