Я не могу использовать Angular для итерации по наблюдаемой Firebase, чтобы получать только историю заказов пользователей и выводить ее в шаблон. Я дошел до изменения switchMap для сопоставления, которое избавляется от ошибки, но тогда я не могу получить доступ к данным из шаблона, как я привык... Я новичок в этом. Ниже вы найдете все необходимые файлы и структуру базы данных.
Этот код...
this.orders$ = authService.user$.switchMap(u => orderService.getOrdersByUser(u.uid));
... дает мне эту ошибку...
Argument of type '(u: User) => Query' is not assignable to parameter of type '(value: User, index: number) => ObservableInput<{}>'.
Type 'Query' is not assignable to type 'ObservableInput<{}>'.
Type 'Query' is not assignable to type 'ArrayLike<{}>'.
Property 'length' is missing in type 'Query'.
... и у меня полная потеря. Если у вас есть предложения, я буду очень благодарен. Спасибо!
Вот мой КОМПОНЕНТНЫЙ ФАЙЛ:
import { AuthService } from './../auth.service';
import { OrderService } from './../order.service';
import { Component, OnInit } from '@angular/core';
import 'rxjs/add/operator/switchMap';
@Component({
selector: 'app-my-orders',
templateUrl: './my-orders.component.html',
styleUrls: ['./my-orders.component.css']
})
export class MyOrdersComponent {
orders$;
constructor(
private authService: AuthService,
private orderService: OrderService) {
this.orders$ = authService.user$.switchMap(u => orderService.getOrdersByUser(u.uid));
console.log(this.orders$);
}
}
СЕРВИСНЫЙ ФАЙЛ:
import { AngularFireDatabase } from 'angularfire2/database-deprecated';
import { Injectable } from '@angular/core';
import { CartService } from './cart.service';
@Injectable()
export class OrderService {
constructor(
private db: AngularFireDatabase,
private cartService: CartService
) { }
getOrdersByUser(userId: string) {
return this.db.list('/orders').$ref.orderByChild('userId').equalTo(userId);
}
}
и МАРКУП:
<h1>Orders</h1>
<table class="table">
<thead>
<tr>
<th>Customer</th>
<th>Date</th>
<th></th>
</tr>
</thead>
<tbody>
<tr *ngFor="let order of orders$ | async">
<td>{{ order.shipping.name }}</td>
<td>{{ order.datePlaced | date}}</td>
<td>
<a href="#">View</a>
</td>
</tr>
</tbody>
</table>
Запросы могут быть заказаны только одним способом. Это означает, что вы можете указывать только orderByChild, orderByKey, orderByPriority или orderByValue.
если вы хотите использовать динамический запрос: https://github.com/angular/angularfire2/blob/master/docs/rtdb/querying-lists.md
Удалите запрос equalTo из файла службы.
СЕРВИСНЫЙ ФАЙЛ:
import { AngularFireDatabase } from 'angularfire2/database-deprecated';
import { Injectable } from '@angular/core';
import { CartService } from './cart.service';
@Injectable()
export class OrderService {
constructor(
private db: AngularFireDatabase,
private cartService: CartService
) { }
getOrdersByUser(userId: string) {
return
this.db.list('/orders').$ref.orderByChild('userId');
}
}
Я пробовал пару вещей сейчас...
компонентный файл: заказы; this.orders = authService.user $.map(u => orderService.getOrdersByUser(u.uid)). subscribe(); console.log(this.orders); разметка: {{orders}}
результат браузера: [объект Object]
А также..
асинхронный}
результат браузера: https://shopdb432.firebaseio.com/orders