Firestore, где оператор с массивами не работает

Я проверяю свою базу данных на наличие ссылки (которая существует), и я не получаю никаких чатов, но не вижу где.

chat.service.ts:

  getUserChats(): Observable<Chat[]> {
        let uid = '-1';
        this.auth.currUser.subscribe(user => (uid = user.uid));
        this.chats = this.afs
          .collection('chats', ref => ref.where('members', 'array-contains', `users/${uid}`))
          .snapshotChanges()
          .pipe(
            map(actions => {
              return actions.map(action => {
                const data = action.payload.doc.data() as Chat;
                const id = action.payload.doc.id;
                return {id, ...data};
              });
            })
          ) as Observable<Chat[]>;
        return this.chats;
      }

Код предназначен для получения всех чатов, в которых зарегистрированный пользователь является участником. Я делаю это, проверяя массив members, есть ли на него какие-либо ссылки.

chat.component.ts:

chats: Observable<Chat[]>;
  constructor(private router: Router, public chatService: ChatService, public dialog: MatDialog, public auth: AuthService) { }

  ngOnInit() {
    this.chats = this.chatService.getUserChats();
  }

chat.component.html:

<mat-list-option *ngFor = "let chat of chats | async" (click) = "handleClick(chatList)" [value] = "chat.id">
        <img matListAvatar src = "./assets/avatar.svg" alt = "Avatar Icon">
        <h3 mat-line>{{chat.name}}</h3>
        <p mat-line>test</p>
      </mat-list-option>

Структура чата:

Firestore, где оператор с массивами не работает

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
56
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

По-видимому, вы запрашиваете users/uid, в то время как это /users/uid, который хранится в вашей базе данных, см. Первый /

К вашему сведению, я только что провел несколько тестов, и косые черты (/) в значении массива не создают никаких проблем (я подозревал, что, возможно, / были причиной проблемы ... но нет). Если я протестирую вашу модель базы данных и значения с помощью «чистого» кода javascript, запрос будет работать хорошо.

Renaud Tarnec 07.11.2018 14:23

Я думаю, что вы вернете this.chat из службы до возврата Observable с сервера. вам нужно вернуть самого Observable .... попробуйте это изменение:

getUserChats(): Observable < Chat[] > {
    let uid = '-1';
    this.auth.currUser.subscribe(user => (
            uid = user.uid;

            //that what you need to return
            return this.afs
                .collection('chats', ref => ref.where('members', 'array- 
                        contains ', `users/${uid}`))
                        .snapshotChanges()
                        .pipe(
                            map(actions => {
                                return actions.map(action => {
                                    const data = action.payload.doc.data() as Chat;
                                    const id = action.payload.doc.id;
                                    return { id,...data   };
                                });
                            })
                        ) as Observable < Chat[] > ;

                    }

                ));

Каждый Observable должен подписаться - но в angular асинхронный канал делает это за вас, поэтому вам просто нужно передать ему Observable.

я редактирую свой ответ - теперь запрос ожидает ответа от пользователя auth

Я не хочу подписываться, я хочу получить Observable в качестве возвращаемого значения @yehonatan yehezkel

filip 07.11.2018 16:59

Я думаю, что оператор switchMap rxjs решит вашу проблему. youtu.be/65Us8NwmYf4?t=242

yehonatan yehezkel 22.11.2018 14:17
Ответ принят как подходящий

Значение '-1' будет искать мгновенно, потому что я не жду завершения работы User Observable, поэтому он ищет -1 и ничего не находит, поэтому мне нужно дождаться пользователя Observable. Тогда все еще не знаю, как вернуть внутреннее наблюдаемое.

Другие вопросы по теме