我希望能够在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>
答案 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;
}
});
}