Angularfire 2 equalTo 查询不适用于从本机 phone 联系人获得的变量值
Angularfire 2 equalTo query not working with variable value obtained from native phone contacts
我正在使用以下内容:Ionic 3、Angularfire 2、usb 连接 iphone 和 Safari 开发者控制台,用于本机 cordova 测试(完整上下文)。
目标是 运行 通过从 phone 联系人中检索到的号码,看看它们是否存在于任何 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 确认已从本机 phone 联系人返回一个号码,例如:
[Log] contact_obj number = - "1234 56789"
.. 但第二个 console.log returns 是一个空数组,就好像查询中没有任何内容与 Firebase 数据库匹配(.. 它 returns 每个日志都相同循环返回的数字):
[Log] number_matches – [] (0)
完整性检查方法(..咖啡 运行 出来了,我可能要疯了)
当我不使用上面两行中的任何一行时,我使用以下行:
var number_to_check = "1234 56789";
(手动输入变量的静态字符串值)
第一个 console.log returns 相同的数字一遍又一遍,如预期的那样看到静态字符串值已分配给 number_to_check 变量。
而第二个 console.log 正确 returns 该数字的数组,表明查询已在 Firebase 数据库中找到匹配项,如下所示:
[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 查询不会获取那个变化的变量?
问题是以下行 returns 的字符串值中有时会出现白色 space(通过访问本机 phone 的联系电话):
contacts[index].phoneNumbers[0].value;
解决办法就是去掉白色space,像这样:
contacts[index].phoneNumbers[0].value.replace(/\s/g, '');
Replace method found in a comment in Remove whitespaces inside a string in javascript
我想白色 space 出现在一些但不是所有号码中必须归结为 phone 在以不同方式添加时如何存储联系号码.. 即通过共享联系人、手动输入等)。
有了这个解决方案,我可以成功找到 phone 数字匹配(我还更新了我的 Firebase 数字字符串,以便在没有 space 的情况下存储)。如下..
"users" : {
"21JvDyuzNcbKTxGhCEyEzzSbwKc2" : {
"name" : "Gary Oose",
"number" : "123456789"
},
"F1AvstJCWqdzBWarXtxwcm01Ir02" : {
"name" : "Tina Urtle",
"number" : "987654321"
},
"KNTJdnKaE3amJ79LOq40ztKWBWp2" : {
"name" : "Tommy Adpole",
"number" : "121212121"
}
}
如果我想在数字字符串中保留 spaces,我可以在 replace() 中添加一个 space 来解决这个问题.. replace(/\s/g, ' ')
我正在使用以下内容:Ionic 3、Angularfire 2、usb 连接 iphone 和 Safari 开发者控制台,用于本机 cordova 测试(完整上下文)。
目标是 运行 通过从 phone 联系人中检索到的号码,看看它们是否存在于任何 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 确认已从本机 phone 联系人返回一个号码,例如:
[Log] contact_obj number = - "1234 56789"
.. 但第二个 console.log returns 是一个空数组,就好像查询中没有任何内容与 Firebase 数据库匹配(.. 它 returns 每个日志都相同循环返回的数字):
[Log] number_matches – [] (0)
完整性检查方法(..咖啡 运行 出来了,我可能要疯了)
当我不使用上面两行中的任何一行时,我使用以下行:
var number_to_check = "1234 56789";
(手动输入变量的静态字符串值)
第一个 console.log returns 相同的数字一遍又一遍,如预期的那样看到静态字符串值已分配给 number_to_check 变量。
而第二个 console.log 正确 returns 该数字的数组,表明查询已在 Firebase 数据库中找到匹配项,如下所示:
[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 查询不会获取那个变化的变量?
问题是以下行 returns 的字符串值中有时会出现白色 space(通过访问本机 phone 的联系电话):
contacts[index].phoneNumbers[0].value;
解决办法就是去掉白色space,像这样:
contacts[index].phoneNumbers[0].value.replace(/\s/g, '');
Replace method found in a comment in Remove whitespaces inside a string in javascript
我想白色 space 出现在一些但不是所有号码中必须归结为 phone 在以不同方式添加时如何存储联系号码.. 即通过共享联系人、手动输入等)。
有了这个解决方案,我可以成功找到 phone 数字匹配(我还更新了我的 Firebase 数字字符串,以便在没有 space 的情况下存储)。如下..
"users" : {
"21JvDyuzNcbKTxGhCEyEzzSbwKc2" : {
"name" : "Gary Oose",
"number" : "123456789"
},
"F1AvstJCWqdzBWarXtxwcm01Ir02" : {
"name" : "Tina Urtle",
"number" : "987654321"
},
"KNTJdnKaE3amJ79LOq40ztKWBWp2" : {
"name" : "Tommy Adpole",
"number" : "121212121"
}
}
如果我想在数字字符串中保留 spaces,我可以在 replace() 中添加一个 space 来解决这个问题.. replace(/\s/g, ' ')