【问题标题】:Angularfire 2 equalTo query not working with variable value obtained from native phone contactsAngularfire 2 equalTo 查询不适用于从本机电话联系人获得的变量值
【发布时间】: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


【解决方案1】:

问题在于以下行返回的字符串值中有时会有空格(通过访问本机电话的联系号码):

contacts[index].phoneNumbers[0].value;

解决方法是去掉空格,如下所示:

contacts[index].phoneNumbers[0].value.replace(/\s/g, '');

Remove whitespaces inside a string in javascript的评论中找到Replace method

我认为某些但并非所有号码中存在的空格必须取决于手机以不同方式添加联系人号码时如何存储联系人号码......即通过共享联系人、手动输入等)。

有了这个解决方案,我可以成功地找到电话号码匹配项(我还更新了我的 Firebase 号码字符串,以便在没有空格的情况下存储)。如下..

"users" : {

    "21JvDyuzNcbKTxGhCEyEzzSbwKc2" : {
      "name" : "Gary Oose",
      "number" : "123456789"
    },
    "F1AvstJCWqdzBWarXtxwcm01Ir02" : {
      "name" : "Tina Urtle",
      "number" : "987654321"
    },
    "KNTJdnKaE3amJ79LOq40ztKWBWp2" : {
      "name" : "Tommy Adpole",
      "number" : "121212121"
    }

}

如果我想在数字字符串中保留空格,我可以在 replace() 中添加一个空格来解决这个问题.. replace(/\s/g, ' ')

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 2015-12-16
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多