Firebase 5 AngularFire2 5:在数据库中查找密钥



我正在尝试控制台Firebase中的键,但它一直按编号顺序给我键。这很好,但是我已经将本地存储ID存储在Firebase中,并希望使用它来访问数据库中的特定节点。

我正在使用一项服务,该服务具有将本地存储 ID 添加到 Firebase 的功能。

购物车服务.ts

import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';
import { Product } from './product';
import { map, take} from 'rxjs/operators';

@Injectable({
providedIn: 'root'
})
export class ShoppingCartService {
constructor(private database: AngularFireDatabase) { }
// creates new id for users
private create() {
return this.database.list('/shopping-cart').push({
dateCreated: new Date().getTime(),
});
}
// get shopping cart from firebase
private getCart(cartId: string) {
return this.database.object('/shopping-cart/' + cartId);
}
// get or create cart Id
private async getOrCreateToCart() {
let cartId = localStorage.getItem('cartId');
if (!cartId) {
let result = await this.create();
localStorage.setItem('cartId', result.key);
console.log('this is result.key: ', result.key);
return result.key;
}
console.log('this is cartId, result: ', cartId);
return cartId;
}
// actually add to cart
async addToCart(product) {
console.log('this is add to cart product: ', product);
const cartId = await this.getOrCreateToCart();
let usr;
const test = this.database.list('/shopping-cart').valueChanges().subscribe(usrs => {
usr = usrs;
});
console.log('This is test: ', test);
// const item = this.database.object('/shopping-cart/' + cartId);
// item.take(1).subscribe(items => {
//   if (items.$exists()) {
//     items.update({quantity: items.quantity + 1});
//   } else {
//     item.set({product: product, quantity: 1});
//   }
// });
}

}

shoppng-cart.service.ts (文件相关部分(

// actually add to cart
async addToCart(product) {
console.log('this is add to cart product: ', product);
const cartId = await this.getOrCreateToCart();
let usr;
const test = this.database.list('/shopping-cart/' + cartId).valueChanges().subscribe(usrs => {
usr = usrs;
});
console.log('This is test: ', test);
// const item = this.database.object('/shopping-cart/' + cartId);
// item.take(1).subscribe(items => {
//   if (items.$exists()) {
//     items.update({quantity: items.quantity + 1});
//   } else {
//     item.set({product: product, quantity: 1});
//   }
// });
}

这是我的网页

<div class="row">
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-12" *ngFor='let user of usrs'>
<div *ngIf="findType(user)">
<h1>This is an object {{user.key}}</h1>
</div>
<div *ngIf="!findType(user)">
<h1>This is not an object</h1>
</div>
</div>
</div>

这是cart.component.ts

import { Component, OnInit } from '@angular/core';
import * as $ from 'jquery';
import { ProductListService } from '../productList.service';
import { AngularFireDatabase } from 'angularfire2/database';
import { ShoppingCartService } from '../shopping-cart.service';
import { Product } from '../product';
@Component({
selector: 'app-cart',
templateUrl: './cart.component.html',
styleUrls: ['./cart.component.css']
})
export class CartComponent implements OnInit {
title = 'Products';
add = 'Add to cart';
products: any[];
usrs: any[];
keys: any[];
productsNumber;

constructor(private db: AngularFireDatabase, public cart: ShoppingCartService) {
const result = db.list('/products').valueChanges().subscribe(products => {
this.products = products;
});
const users = db.list('/shopping-cart').valueChanges().subscribe(usr => {
this.usrs = usr;
console.log(this.usrs);
})
}
addToCart(product) {
console.log('This is product object: ', product);
return this.cart.addToCart(product);
}
findType(element, obj){
if(typeof element === 'object') {
return true;
}
return false;
}
ngOnInit() {
}
}

我的最终目标是找到我保存在数据库中的 cartId,向其添加一个数组,每次有人单击添加到购物车时,都会将该信息推送到该特定用户数组中。

目前,我只是尝试访问 cartId。我的数据库结构像

数据库结构

不重要的文件夹

-something inside folder 1
-something inside folder 2
-something inside folder 3

购物车

- 01: 'test'
- -Lk234fkge (some random key I just made up but this is what the keys look like)
- folder inside long key
- -Lk99388kkfl
- folder inside long key

问题是,每次我使用 Object.keys(obj( 控制台键时,我都会得到 0,1,2 而不是 0(长键名(,(其他长键名(。我尝试使用 .list 来尝试这样做,对我来说,这似乎是我尝试过的所有事情中应该做的事情,但我无法让它工作。正如您从查看服务文件中看到的那样,我也尝试使用 .object,然后使用 take 和订阅来访问数据,但我不断收到一个错误,即 take 不是函数。因此,我决定从顶部开始,只是尝试访问特定的密钥。任何帮助将不胜感激,我花了两天时间阅读,做教程,但其中大多数都已经过时了。我搜索了Firebase文档,除了示例之外找不到任何东西,由于我对Firebase的了解有限,似乎与我想要实现的目标不符。如果您花时间阅读本文,谢谢。如果您熟悉,请添加到讨论中。

.valueChanges()返回一个数组;这就是为什么Object.keys返回递增整数0, 1, 2, ...。如果你想获得ids,你将需要使用类似的东西.snapshotChanges();它仍然在一个数组中(但会有一个.key属性(,所以如果你真的需要一个对象,你需要减少它。

有关使用值与快照更改的更多信息,请参阅 AngularFire 文档:https://github.com/angular/angularfire2/blob/master/docs/rtdb/lists.md#angularfireaction---action-based-api

最新更新