0

ボタンが発火した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 は undefined として表示され続けます。これが私の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>
4

1 に答える 1

2

問題は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;
      }
   });
}
于 2013-05-24T19:46:13.867 に答える