【发布时间】:2017-09-16 19:26:30
【问题描述】:
我正在使用以下产品:Ionic 3、Angularfire 2、usb 连接的 iphone 和 Safari 开发者控制台,用于原生 cordova 测试(完整上下文)。
我们的目标是遍历从电话联系人中检索到的号码,并查看它们是否存在于任何 Firebase /users/~user id string~/ ..然后如果存在则执行操作。
简短的问题概述是,我的方法是为每个数字返回空数组,就好像 Angularfire equalTo 查询没有从输入的变量中传递一个值一样。
Firebase 结构
- users
- <user id string>
- name: "Some name"
- number: "1234 56789"
导出的 JSON 示例(不是真实姓名或数字):
"users" : {
"21JvDyuzNcbKTxGhCEyEzzSbwKc2" : {
"name" : "Gary Oose",
"number" : "1234 56789"
},
"F1AvstJCWqdzBWarXtxwcm01Ir02" : {
"name" : "Tina Urtle",
"number" : "987 654321"
},
"KNTJdnKaE3amJ79LOq40ztKWBWp2" : {
"name" : "Tommy Adpole",
"number" : "121 212 121"
}
}
代码如下..
contacts.find(["name", "phoneNumbers"], {multiple: true, hasPhoneNumber: true}).then(contacts => {
contacts.forEach((contact, index) => {
if (contacts[index].phoneNumbers !== null) {
var number_to_check = contacts[index].phoneNumbers[0].value;
//var number_to_check = contacts[index].phoneNumbers[0].value;toString();
//var number_to_check = "1234 56789";
console.log("contact_obj number = ", number_to_check);
let db_users_list = this.afDB.list(`/users/`,
{
query: {
orderByChild: 'number',
equalTo: number_to_check
}
}
).subscribe(number_matches => {
console.log('number_matches ', number_matches);
db_users_list.unsubscribe();
});
}
});
});
运行上述代码
当使用以下任一行时:
var number_to_check = contacts[index].phoneNumbers[0].value;
或
var number_to_check = contacts[index].phoneNumbers[0].value.toString();
(后者因为我不确定控制台输出是否对我说谎它正在返回一个字符串)
..代码中的第一个console.log确认已经从本机电话联系人返回了一个号码,例如:
[Log] contact_obj number = - "1234 56789"
.. 但第二个 console.log 返回一个空数组,好像没有任何内容与查询中的 Firebase DB 匹配(.. 它为从循环返回的每个数字返回相同的日志):
[Log] number_matches – [] (0)
健全性检查方法(..咖啡用完了,我可能要疯了)
当我不使用上述两行中的任何一行时,我使用以下行:
var number_to_check = "1234 56789";
(手动输入变量的静态字符串值)
第一个 console.log 一遍又一遍地返回相同的数字,正如预期的那样,看到一个静态字符串值已分配给 number_to_check 变量。
第二个console.log 正确返回了该数字的数组,表明查询已在Firebase DB 中找到匹配的,如下所示:
[Log] number_matches
Array (1)
0 {name: "Gary Oose", number: "1234 56789", $key: "21JvDyuzNcbKTxGhCEyEzzSbwKc2"}
那么,有没有人知道为什么第一种方法(使用下面的代码行)不起作用?
var number_to_check = contacts[index].phoneNumbers[0].value;
我觉得我错过了一些非常明显的东西。为什么 AngularFire equalTo 查询不会接收到这个变化的变量?
【问题讨论】:
-
作为测试,我在 Firebase 数据库和手机上的测试联系人中将 Tommy Adpole 号码从“121 212 121”更改为“121”,然后运行相同的代码......奇怪..看起来与 equalTo 和一个动态创建的字符串变量有关,其中包含数字,它们之间有空格..也许。
-
好吧,我相信我已经找到了罪魁祸首。联系人[index].phoneNumbers[0].value;正在返回带有空格的电话号码,在某些但并非所有情况下(这必须取决于以不同方式添加联系号码时电话如何存储它们)。使用 .replace(/\s/g, '') 删除所有空格(在stackoverflow.com/questions/10800355/… 的评论中找到)..它成功找到了匹配项(我更新了我的 Firebase 数字字符串以不带空格存储)。一旦理智检查,我会用答案更新线程。
标签: javascript firebase-realtime-database cordova-plugins ionic3 angularfire2