我想在firebase中使用$key
来路由链接。但是,在浏览完所有文档和论坛后,我得到的答案是使用object.$key
来检索值。我使用它仍然会返回undefined
。
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Price</th>
<th></th>
</tr>
</thead>
<tbody>
<tr *ngFor="let p of products$ | async">
<td>{{ p.title }}</td>
<td>{{ p.price }}</td>
<td>
<a [routerLink]="['/admin/products/', p.$key]">Edit</a>
</td>
</tr>
</tbody>
products$
会返回AngularFireList
products$;
constructor(private productService: ProductService) {
this.products$ = this.productService.getAll().valueChanges();
}
这是产品服务定义。
export class ProductService {
constructor(private db: AngularFireDatabase) { }
create(product) {
return this.db.list('/products').push(product);
}
getAll() {
return this.db.list('/products');
}
get(productId) {
return this.db.object('/products/' + productId);
}
}
我仍然不确定这有什么问题,因为它返回/admin/products/undefined
正如我在阅读时所读到的所有参考资料都使用此object.$key
答案 0 :(得分:0)
.$key
。如果您需要使用密钥snapshotChanges()
see our migration guide for more details。
constructor(private productService: ProductService) {
this.products$ = this.productService.getAll().snapshotChanges();
}
然后在视图中使用有效负载:
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Price</th>
<th></th>
</tr>
</thead>
<tbody>
<tr *ngFor="let p of products$ | async">
<td>{{ p.payload.val().title }}</td>
<td>{{ p.payload.val().price }}</td>
<td>
<a [routerLink]="['/admin/products/', p.key]">Edit</a>
</td>
</tr>
</tbody>
或者您可以将快照更改映射到您更熟悉的结构中:
constructor(private productService: ProductService) {
this.products$ = this.productService.getAll()
.snapshotChanges()
.map(s => ({"$key": s.key, ...s.payload.val()}))
}