我有一个案例需要 动态 检索 特定 图书的结果。我想使用 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)
感谢您花时间阅读这篇长篇文章。我是初学者,我经历过很多帖子,但不幸的是由于我缺乏离子的经验,我无法应用适当的变化。
答案 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。