【发布时间】:2018-08-20 20:56:48
【问题描述】:
我有一个案例,我需要动态地检索特定书籍的结果。我想通过使用它的 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 存储库的链接:
https://github.com/islamaymansais/honey_scanner (转到 src -> pages -> login -> login.ts)
感谢您花时间阅读这篇长文。我是初学者,我已经浏览了很多帖子,但不幸的是,由于我缺乏使用 ionic 的经验,我无法应用适当的更改。
【问题讨论】:
-
非常感谢您的回复!我试过你的建议,应用程序崩溃了。这是它给我的错误:“无法读取未定义类型错误的属性'文本'”所以我将代码更新为: async Scan(){ this.results = await this.barcodeScanner.scan(); this.results = this.results['text'] } 然后在您的代码中我将其更新为: this.bookResults = this.database.list('/results', ref => (typeof this.results != "undefined" && this.results != "") ? ref.orderByChild('isbnNumber').equalTo(this.results) : ref ).snapshotChanges();
-
但是,我没有得到任何结果。我不确定这是否是我的 html 的查询本身无效的问题。终端显示“consol.warn: FIREBASE WARNING: Invalid query string segment:” 在我的 HTML 中,我使用它来演示结果:
Book Name: {{results.bookName}}
-
您认为这是 HTML 的问题吗?我已经更新了我的 git 存储库,以便您可以查看该特定页面,如果您想完整而清晰地查看代码链接到 repo 的部分:github.com/islamaymansais/honey_scanner/tree/master/src /pages/... 我将此页面命名为“登录”,但我可能应该更改名称以使其不那么混乱。但是,这是您感兴趣的页面。
-
我刚刚尝试重新运行我的更新,这就是我得到的结果:'{}' 类型的参数不可分配给'string |号码 |布尔值'。类型“{}”不可分配给类型“false”。更具体地说,突出显示的错误是更新代码的“.equalTo(this.results)”组件:this.bookResults = this.database.list('/results', ref => (typeof this.results != "undefined " && this.results != "") ? ref.orderByChild('isbnNumber').equalTo(this.results) : ref ).snapshotChanges();请指教
-
this.results.text将包含扫描的条码 isbn 图书的编号。您将条形码扫描结果保存在结果对象中。您需要将其传递给查询以获取特定的 firebase 数据库对象。我将编辑我的帖子以使其更清晰。
标签: firebase ionic-framework ionic3 barcode angularfire2