Как я могу добавить условие в мой запрос Firebase в Ionic? - PullRequest
0 голосов
/ 21 мая 2019

Я работаю над приложением, основанным на определении местоположения, как часть университетского проекта, в котором пользователь должен иметь возможность "отбрасывать определенные сообщения в окружении хина, чтобы их могли видеть другие пользователи. Я использую Ionic v4 и Firebase в качестве базы данных.К сожалению, я довольно новичок в Ionic и Firebase, поэтому я не знаю, что делать, если не найду здесь ответа на свою проблему, поэтому решил, что с таким же успехом могу просто спросить.

Еще немного предыстории: я получил упомянутые капли , которые пользователь может написать, теперь я хочу, чтобы другие пользователи могли повышать и понижать эти капли . капли видны в openstreetmap с листовкой . До сих пор я получил все, чтобы работать, как задумано, но теперь я хочу получить 20% лучших из всех капель на основе их оценкии изменил значок, показанный на моей карте. Я думал, что смогу добиться этой покупки, добавив еще один запрос к базе данных к моему исходному, который просто получает каждый drop из моей базы данных.ionic service.

Это мой оригинальный запрос для получения каждой записи:

private dropsCollection: AngularFirestoreCollection<Drop>;
private drops: Observable<Drop[]>;

this.dropsCollection = db.collection('drops', ref =>
    ref.where('createdAt', '>=', validMinTime)
);

А вот запрос для получения kingDrops :

private kingdropsCollection: AngularFirestoreCollection<Drop>;
private kingDrops: Observable<Drop[]>;

// 2 should be replaced dynamicly with the total amount of drops*0.2
const topDrops = 2; 

this.kingdropsCollection = db.collection('drops', ref =>
    ref.orderBy('score', 'desc').limit(topDrops)
);

Насколько я знаю, синтаксис должен быть в порядке, но как я могу реализовать этот запрос как "условие" в моем интерфейсе?Мне нужно иметь возможность динамически определять, какая из моих капель является kingDrop , и соответственно изменять значок.Вот код моего home.page.ts

import {Component, ElementRef, ViewChild} from '@angular/core';
import * as Geolib from 'geolib';

import leaflet from 'leaflet';
import {NavController} from '@ionic/angular';
import {Drop, DropService} from '../../services/drop.service';
import {AppComponent} from '../../app.component';
import {Router} from '@angular/router';
import {UserService} from '../../services/user.service';

@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss']
})
export class HomePage {

    myDrops: Drop[];

    @ViewChild('map') mapContainer: ElementRef;

    map: any;

    constructor(
        private router: Router,
        public navCtrl: NavController,
        public dropService: DropService,
        public appComponent: AppComponent,
        public userService: UserService
    ) {}
    ionViewDidEnter() {
        this.loadmap();
    }
    loadmap() {
        const positionIcon = leaflet.icon({
            iconUrl: '../../../assets/icon/position.png',
            shadowUrl: '../../../assets/icon/position-shadow.svg',

            iconSize: [30, 30], // size of the icon
            shadowSize: [30, 30], // size of the shadow
            iconAnchor: [0, 0], // point of the icon which will correspond to marker's location
            shadowAnchor: [2, -2], // the same for the shadow
            popupAnchor: [0, 0] // point from which the popup should open relative to the iconAnchor
        });
        this.map = leaflet.map('map').fitWorld();
        leaflet.tileLayer(
            'https://api.maptiler.com/maps/positron/{z}/{x}/{y}.png?key=JrASdfPCkNw3CYBKAD6E',
            {
            attributions:
            'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',
            maxZoom: 18,
            minZoom: 15
            }
        )
        .addTo(this.map);
        this.map.locate({
            setView: true,
            maxZoom: 10,
            minZoom: 15
        })
        .on('locationfound', e => {
            const markerGroup = leaflet.featureGroup();
            const marker: any = leaflet
            .marker([e.latitude, e.longitude], {
                icon: positionIcon,
                zIndexOffset: -1000 // put the markers on top of the location marker
            })
            .on('click', () => {
                console.log('Position marker clicked');
            });
            markerGroup.addLayer(marker);
            this.map.addLayer(markerGroup);
        })
        .on('locationerror', err => {
            console.log(err.message);
        });
        this.loadMarkers();
    }
    loadMarkers() {
        const greyDropIcon = leaflet.icon({
            iconUrl: '../../../assets/icon/grey-drop.png',
            shadowUrl: '../../../assets/icon/drop-shadow.svg',

            iconSize: [25, 30], // size of the icon
            shadowSize: [25, 30], // size of the shadow
            iconAnchor: [0, 0], // point of the icon which will correspond to marker's location
            shadowAnchor: [2, -2], // the same for the shadow
            popupAnchor: [-3, -5] // point from which the popup should open relative to the iconAnchor
        });

        this.dropService.getDrops().subscribe((drops: any) => {
            drops.forEach(singledrop => {
                if (this.dropService.isDropVisible(singledrop)) {
                    const dropGroup = leaflet.featureGroup();
                    // check visibleDrops array of user for drops and add them
                    const dist = this.checkDropDistance(singledrop);
                    if (dist < 1500 && singledrop.score > -10) {
                        this.setDropVisible(singledrop);
                    } else if (singledrop.score > -10) {
                        const drop: any = leaflet.marker([singledrop.latitude, singledrop.longitude], {
                            icon: greyDropIcon
                        })
                        .on('click', () => {
                            console.log('Marker clicked, but out of range');
                        });
                        dropGroup.addLayer(drop);
                        this.map.addLayer(dropGroup);
                    }
                }
            });
        });
    }
    // ... 
}

Я пытался реализовать kingDrops так же, как drop выше, как это:

this.dropService.getKingDrops().subscribe((drops: any) => {
    //..
});

Но это не сработало, и оно было бы продублировано, так как оригинальные капли уже есть на моей карте. Мне нужно какое-то условие, чтобы определить, есть ли падение это kingDrop или нет, и реализуйте значок соответствующим образом, но я не знаю синтаксис для написания такого условия ..

Может кто-нибудь помочь мне здесь?

1 Ответ

0 голосов
/ 21 мая 2019

Я предлагаю добавить необязательный логический параметр в вашу модель «Drop», чтобы указать kingdrop. Поскольку у вас мало дропов короля, вам следует перебирать каждый элемент и искать исходный массив, чтобы найти совпадения, используя метод indexof Затем вы должны изменить необязательный параметр drop для этого индекса массива на true, а затем использовать эту переменную для загрузки значков. Пример:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...