使用条形码扫描仪(Ionic 3& Angularfire2)的结果进行Firebase动态查询

时间:2018-03-12 18:19:33

标签: firebase ionic-framework ionic3 barcode angularfire2

我有一个案例需要 动态 检索 特定 图书的结果。我想使用 ISBN号 检索该特定书籍(下面以粗体突出显示)。这就是我的数据库的样子:

{
  "results" : 
  {
    "key1" : {
      "Character_Depth" : 4,
      "Dialogue" : 4,
      "Plot" : 5,
      "Theme" : 3,
      "Writing_Style" : 3,
      "bookName" : "Ionic",
      "isbnNumber" : "0123456789012"
    },
    "key2" : {
      "Character_Depth" : 4,
      "Dialogue" : 4,
      "Plot" : 4,
      "Theme" : 2,
      "Writing_Style" : 4,
      "bookName" : "Justin",
      "isbnNumber" : "036000291452"
    }
  }
}

在深入研究代码之前,我认为您需要了解一些重要信息。我要特别做的是使用条形码扫描仪扫描书籍的ISBN号。然后我想使用扫描的ISBN号来动态检索该数据库的结果。话虽如此,我需要设计我的代码,使条形码扫描器变量每次(每次扫描)更新为新的条形码编号(已完成)。然后将该条形码编号输入到查询中(我仍然无法工作, 是我需要帮助的 ),它根据该查询检索子节点号。

我的代码:

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, AlertController } from 'ionic-angular';
import { BarcodeScanner, BarcodeScannerOptions } from '@ionic-native/barcode-scanner';
import { AngularFireAuth } from 'angularfire2/auth';
import { AngularFireDatabase, AngularFireList } from 'angularfire2/database';
import { HomePage } from '../home/home';
import { Observable } from 'rxjs/Observable';

@IonicPage()
@Component({
  selector: 'page-login',
  templateUrl: 'login.html',
})
export class LoginPage {

  bookResults: Observable<any[]>;
  options: BarcodeScannerOptions;
  results: {};
  constructor(public navCtrl: NavController, 
              public navParams: NavParams, 
              private fire: AngularFireAuth, 
              private database: AngularFireDatabase, 
              private barcodeScanner: BarcodeScanner, 
              private alertCtrl: AlertController) {

/* ########## part of the code where I specifically need help ########## */
        this.bookResults = this.database.list('results').valueChanges();
  }

/* ########### Barcode scanner function */
  async Scan(){
    this.results = await this.barcodeScanner.scan();
    console.log(this.results);
  }

}

现在,发生的是"this.bookResults = this.database.list('results').valueChanges();"检索上述数据库。但是,我需要一些指导,以便如何更改我的查询,以便我可以根据每个子节点的“isbnNumber”实例检索特定的子节点。

我尝试过几件事。最近我尝试过:

 this.bookResults = this.database.list('/results', {
 query: {
    orderByChild: isbnNumber,
    equalTo: this.results,
    }
 });

但这不起作用。我尝试过其他的东西,比如:

 this.bookResults = 
 this.database.list('/results/${this.results}').valueChanges();

但它也没有用。

我已经阅读了各种stackoverflow线程,所以如果将其标记为重复,我不会感到惊讶。我已经尝试过遵循各种线程的指令,但我觉得从数据库中检索信息的方式并不特别适用于我目前的情况,因为用于检索硬编码到查询中的特定子节点的值。我需要一个动态变化的查询,根据条形码扫描器的结果调整自己。

如果这篇文章中有任何不清楚的地方,请告诉我,我非常乐意提供帮助。此外,如果您有兴趣查看源代码,这里有一个链接到我的github repo包含它:

https://github.com/islamaymansais/honey_scanner (转到src - &gt; pages - &gt; login - &gt; login.ts)

感谢您花时间阅读这篇长篇文章。我是初学者,我经历过很多帖子,但不幸的是由于我缺乏离子的经验,我无法应用适当的变化。

2 个答案:

答案 0 :(得分:0)

根据Angular firebase库的自述文件说明,以下内容应该有效:

constructor(public navCtrl: NavController, 
          public navParams: NavParams, 
          private fire: AngularFireAuth, 
          private database: AngularFireDatabase, 
          private barcodeScanner: BarcodeScanner, 
          private alertCtrl: AlertController) {
   this.getData();
}


async function Scan(){
   this.results = await this.barcodeScanner.scan();
   console.log(this.results);
   this.getData();
 }

this.getData = () => {
  var scanned_Barcode_Text = "";
  if (Object.keys(this.results).length > 0){
     if(typeof this.results['text'] != 'undefined' && this.results['text'] != ""){
      scanned_Barcode_Text = this.results['text'];
     }
   }


  this.bookResults = this.database.list('/results', 
        ref => (scanned_Barcode_Text != "") ? ref.orderByChild('isbnNumber').equalTo(scanned_Barcode_Text) : ref
  ).snapshotChanges();
}

在构造函数中调用getData()函数,也在条形码扫描的成功函数中调用。

orderBy和等于查询只能在引用对象上调用,这是AngularFireDatabase对象的第二个参数(可选)。用法类似于Array.prototype的reduce函数。

希望这有帮助。

答案 1 :(得分:0)

试试这个。

let booksRef = this.firebase.database().ref("results/");
booksRef.orderByChild("isbnNumber").equalTo(scannedBarCode).on("child_added", function(data) {
   console.log(data.val());
   this.bookResults = data.val();
});

我正在考虑您已经获得了条形码值并将其保存在变量scannerBarCode中。

旁注:在我看来,既然你在查询ISBN上的数据库,你应该使用它而不是key。它会使它变得简单。还可以尝试具有更好查询功能的新Cloud Firestore。