Firebase 5 AngularFire2 5: найти ключ в базе данных - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь утешить ключи в firebase, но он продолжает давать мне ключи в пронумерованном порядке.Это было бы хорошо, но я сохранил localStorage Id в firebase и хочу использовать его для доступа к этому конкретному узлу в базе данных.

Я использую сервис, который имеет функции, которые добавляют идентификатор локального хранилища в firebase.

shopping-cart.service.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});
    //   }
    // });
   }

Это мой HTML

 <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, который я сохранил в базе данных, добавить в него массив, и каждый раз, когда кто-то нажимает кнопку add, добавьтеcart передает эту информацию в этот конкретный пользовательский массив.

Сейчас я просто пытаюсь получить доступ к 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 и subscribe для доступа к данным, но я продолжал получать сообщение об ошибке, что take не является функцией.Итак, я решил начать сверху и просто попытаться получить доступ к определенному ключу.Любая помощь будет принята с благодарностью, я потратил два дня на чтение, учебные пособия, но большинство из них устарели.Я искал документы по базе данных по пожарной базе и не мог найти ничего, кроме примеров, которые, с моим ограниченным знанием базы знаний, казалось, не соответствовали тому, что я пытался выполнить.Если вы нашли время, чтобы прочитать это, спасибо.Пожалуйста, добавьте к обсуждению, если это вам знакомо.

1 Ответ

0 голосов
/ 30 мая 2018

.valueChanges() возвращает массив;вот почему Object.keys возвращает увеличивающиеся целые числа 0, 1, 2, ....Если вы хотите получить идентификаторы, вам нужно использовать что-то вроде .snapshotChanges();хотя он все еще находится в массиве (но будет иметь атрибут .key), поэтому, если вам действительно нужен объект, вам нужно его уменьшить.

См. документацию AngularFire для получения дополнительной информации об использовании значения.Сравнение изменений снимка: https://github.com/angular/angularfire2/blob/master/docs/rtdb/lists.md#angularfireaction---action-based-api

...