0

我使用以下方法:Ionic 3,Angularfire 2,USB连接iphone用于原生cordova测试的Safari Developer控制台(用于完整上下文)。Angularfire 2 equalTo查询不能使用从本地手机联系人获得的变量值

目标是运行从手机通讯录中检索的数字,并查看它们是否存在于任何Firebase/users /〜用户ID字符串〜/ ..之后如果它们做了事情。

简短的问题大纲是,我的方法是为每个数字返回空数组,就好像Angularfire的equalTo查询没有从要被馈入的变量中传递一个值。

火力地堡结构

- 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(); 

(后者,因为我不知道,如果控制台输出在骗我,这是一个返回字符串)

代码..the第一的console.log证实,一些已经从本地手机通讯录恢复,如:

[Log] contact_obj number = - "1234 56789‬" 

..但第二的console.log返回一个空数组,仿佛一切都没有对火力地堡DB查询匹配(..它返回相同的日志,从环路返回的每个号码):

[Log] number_matches – [] (0) 

完整性检查办法(..coffee的运行了,我可能会疯了)

,而不是使用这两种线路的上空时,我用的是以下行:

var number_to_check = "1234 56789"; 

(手动输入用于可变的静态字符串值)

第一的console.log反复返回相同的号码,如预期看到的静态字符串值已被分配给number_to_check变量。

而第二个控制台。登录正确返回该编号的数组,表示查询已找到匹配它在火力地堡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查询拾取?

+0

作为一项测试,我将Firebase数据库中的Tommy Adpole数字从“121 212 121”更改为“121”,然后将手机上的测试联系人更改为相同的代码。怪异......看起来像是与equalTo和一个动态创建的字符串变量,其中包含数字与他们之间的空间......或许。 – sean

+0

好吧,我相信我找到了罪魁祸首。联系人[index] .phoneNumbers [0] .value;在某些情况下(但并非所有情况下),手机的数字都会以空白符号的形式返回(当联系人号码以不同方式添加时,它必须由手机存储)。使用.replace(/ \ s/g,'')删除所有的空格(在https://stackoverflow.com/questions/10800355/remove-whitespaces-inside-a-string-in-javascript中的评论中找到) ..it成功找到匹配项(我更新了我的Firebase编号字符串以存储空间)。一旦完成检查,我会用一个答案更新线程。 – sean

回答

0

问题是,有时候有空格的字符串值,下面一行返回(访问本地电话的联系号码):

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

的解决被删除空格,就像这样:

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

Replace method在评论中发现在Remove whitespaces inside a string in javascript

我想象中的空白存在于一些但并不是所有号码都必须符合电话如何以不同的方式添加联系号码时的存储方式......即通过共享联系人,手动录入等)。

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

"users" : { 

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

} 

如果我想继续在数字串的空间,我可以在添加一个空格替换()以考虑..更换(/ \ s /克,“ ')