无法使用.once()函数从Firebase数据库中读取数据

时间:2013-05-24 18:58:09

标签: javascript jquery database web-applications firebase

我希望能够在Firebase按钮触发事件时从onclick数据库中读取一段数据。从浏览文档开始,似乎once()函数就是这里的方法,因为我并没有尝试将数据读取链接到任何特定的Firebase事件,例如添加子项,而是当有人点击页面上的按钮时。这是我呼叫once() ...

的行
curPoll.once('value', function(curPollSnapshot) {
    numElections = curPollSnapshot.val().NumElections;
});

问题是我无法读取数据,即使curPoll设置为数据引用,numElections是我脚本中的全局变量。 numElections一直以未定义的形式返回。实际上,我甚至无法进入FireBug中的函数,就好像存在语法错误一样。如果有语法错误,我无法弄明白,无论如何,我认为如果是这样的话,整个脚本根本不会加载到Firebug中。但是,因为我可能无法进入功能,看看出于某种原因发生了什么。

这是设置curPoll的功能......

function createPoll() 
{
    var pollName = $('#txtCreatePoll').val();
    if (pollName == "" || pollName == null)
    {
         alert("You must enter a name for your poll!");
         return;
    }
    else 
    {
        pollsRef = new Firebase('https://poll-database.firebaseio.com/Polls');
        //TODO add error callback
        curPoll = pollsRef.push({Name: pollName, Elections: null, NumElections: 0 });
        elections = curPoll.push();
        $('div#divCreateElections1').slideDown('slow');
    }
 }

正如您所看到的那样,elections引用作为参考子curPoll被推入。

这是我尝试从选举参考中读取数据的函数....

            function addElection()
            {
                curPoll.once('value', function(curPollSnapshot) {
                    numElections = curPollSnapshot.val().NumElections;
                });
                var electionName = $('div#divCreateElections' + (parseInt(numElections)+1) + ' > input#txtCreateElection').val();
                var numberToElect = $('div#divCreateElections' + (parseInt(numElections)+1) + ' > input#txtNumElect').val();
                if (electionName == "" || electionName == null)
                {
                    alert("You must enter a name for your election!");
                    return;
                }
            }

正如我所说,numElections一直未定义。这是我的firebase数据库的基本结构...

Poll-Database > Polls > Poll1
                        Poll2
                        ...
                        Polln > Name
                              > NumElections
                              > Elections > Election1
                                          > Election2
                                          ...
                                          > Electionn

以防万一这是我页面的正文......

<body>
    <div id="divCreatePoll">
        Enter Name of New Poll:
        <input type="text" id="txtCreatePoll" value="" />
        <br /><br />
        <button id="btnCreatePoll" onclick="createPoll(); return false;">CREATE POLL</button>
        <p id="pError"></p>
    </div>
    <div id="divCreateElections1">
        Enter Election Name:
        <input type="text" id="txtCreateElection" value="" />
        <br /><br />
        Enter Number of Candidates to Elect:
        <input type="text" id="txtNumElect" value="" />
        <br /><br />
        <button id="btnCreateElection" onclick="addElection(); return false;">CREATE ELECTION</button>  
        <br /><br />
        <p id="pError"></p>
    </div>
</body>

1 个答案:

答案 0 :(得分:3)

问题是once是异步调用。所以它不会立即设置numElections。因此,当您使用numElections时,它尚未设置。

你只需要在回调中移动其余的代码。

function addElection() {
   curPoll.once('value', function(curPollSnapshot) {
      numElections = curPollSnapshot.val().NumElections;
      var electionName = $('div#divCreateElections' + (parseInt(numElections)+1) + ' > input#txtCreateElection').val();
      var numberToElect = $('div#divCreateElections' + (parseInt(numElections)+1) + ' > input#txtNumElect').val();
      if (electionName == "" || electionName == null)
      {
         alert("You must enter a name for your election!");
         return;
      }
   });
}