2017-02-18 1 views
0

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); 
       }); 
     } 
    } 
+0

Похоже, проблема заключается в том, как вы создаете массив 'this.nearme'. Вы нажимаете на него пользователя, затем вы испускаете. Вы нажимаете другое значение, затем вы испускаете. Не лучше ли было бы получить всех близких пользователей **, а затем ** испустить массив ОДИН РАЗ? – AngularChef

ответ

3

То есть то, что BehaviorSubject является for, он сначала дает значение, которое есть , а после этого все следующие значения. Если вы не хотите получить первое значение, измените его на Subject.

public subject: Subject<any> = new Subject(); 

Может быть ReplaySubject также может работать для вас:

http://xgrommx.github.io/rx-book/content/subjects/replay_subject/index.html

UPDATE:

this.nearme.push({ 
     userid: key, 
     userloc: location, 
    }); 
    this.subject.next(this.nearme); 

Как я понимаю, этот код, приращение массива с новыми значениями и хочу весь массив будет показан подписчикам снова? Если нет,

this.subject.next({ 
     userid: key, 
     userloc: location, 
    }); 
+0

Тогда я не могу получить последнее значение – Kravitz

+0

@REPTILE Вы взглянули на replaysubject с длиной буфера 1? – laser

+0

Нет, но теперь я буду – Kravitz