Firebase中数字对象的数字对象ID

时间:2014-03-07 14:41:41

标签: javascript json forms input firebase

我对'游戏'很新,并且想知道是否可以通过数字方式将新添加的数据(通过表单和输入)订购到Firebase,以便每个新数据条目获取ID(最后添加的数据的数量+ 1)。 为了更清楚,您可以在下面找到当前如何添加数据的屏幕截图。数据点0-7是现有的(JSON导入数据),具有随机创建的ID的数据属于新条目。我希望条目符合Firebase内部的编号,否则我的D3条形图将无法显示。

var firebaseData = new Firebase("https://assignment5.firebaseio.com");

function funct1(evt)
{
 var gameName = $('#nameInput').val();
      var medalCount = $('#medalsInput').val();
      var bool = $('#boolInput').is(':checked');
firebaseData.push().set({games: gameName, medals: medalCount, summergames: bool});
 evt.preventDefault();
}
var submit = document.getElementsByTagName('button')[0];
submit.onclick = funct1;

更新:

function funct1(evt) 
{ 
var gameName = $('#nameInput').val(); 
var medalCount = $('#medalsInput').val(); 
var bool = $('#boolInput').is(':checked');
for (var i = 0; i < 10; i++) 
{ 

firebaseData.child('7'+ i).set({games:gameName,medals:medalCount,summergames:bool}(i)); };

问题:

1 个答案:

答案 0 :(得分:1)

有两种方法可以为文档节点生成ID。

  1. 在您的引用上调用.push()将生成该唯一ID。
  2. 在您的参考号上调用.set()将允许您使用自己的 标识。
  3. 现在您正在使用.push().set({}),因此push会生成一个新ID,而该设置只会设置数据。

    // These two methods are equivalent
    listRef.push().set({user_id: 'wilma', text: 'Hello'});
    listRef.push({user_id: 'wilma', text: 'Hello'});
    

    使用.set()而不使用.push(),您可以控制自己的ID。

    使用.push()

    在Firebase中管理数据列表时,由于数据是实时更新的,因此使用唯一生成的ID非常重要。如果正在使用整数ID,则可以轻松覆盖数据。

    仅仅因为您拥有唯一ID,并不意味着您无法通过ID查询数据。您可以遍历父引用并获取所有子引用。

        var listRef = new Firebase('https://YOUR-FIREBASE.firebaseio.com/items');
    
        // constructor for item
        function Item(id) {
            this.id = id;
        };
    
        // add the items to firebase
        for (var i = 0; i < 10; i++) {
            listRef.push(new Item(i));
        };
    
        // This will generate the following structure
        // - items
        //   - LGAJlkejagae
        //      - id: 0
    
    
        // now we can loop through all of the items
        listRef.once('value', function (snapshot) {
            snapshot.forEach(function (childSnapshot) {
                var name = childSnapshot.name();
                var childData = childSnapshot.val();
                console.log(name); // unique id
                console.log(childData); // actual data
                console.log(childData.id); // this is the id you're looking for
            });
        });
    

    childData变量中,您可以访问您的数据,例如您想要的ID。

    使用.set()

    如果您想管理自己的ID,可以使用set,但是在添加项目时需要更改子引用。

        for (var i = 0; i < 10; i++) {
            // Now this will create an item with the id number
            // ex: https://YOUR-FIREBASE.firebaseio.com/items/1
            listRef.child('/' + i).set(new Item(i));
        };
    
        // The above loop with create the following structure.
        // - items
        //   - 0
        //     - id: 0
    

    要获取数据,您可以使用上述相同的方法遍历节点中的所有子项。

    那么使用哪一个?

    如果您不希望轻易覆盖数据,请使用.push()

    当您的ID确实非常重要时,请使用.set(),并且您不关心您的数据是否被轻易覆盖。

    修改

    您遇到的问题是您需要知道列表中的项目总数。 This feature is not implemented in Firebase因此您需要加载数据并获取项目数。我建议在页面加载和缓存时执行此操作,如果您真的希望维护该ID结构,则会计算。 这会导致性能问题

    但是,如果您知道需要索引的内容,或者不想覆盖索引,我就不会从firebase加载数据。

    在您的情况下,您的代码看起来像这样:

    // this variable will store all your data, try to not put it in global scope
    var firebaseData = new Firebase('your-firebase-url/data');
    var allData = null;
    // if you don't need to load the data then just use this variable to increment
    var allDataCount = 0; 
    
    // be wary since this is an async call, it may not be available for your
    // function below. Look into using a deferred instead.
    firebaseData.once('value', function(snapshot) {
      allData = snapshot.val();
      allDataCount = snapshot.numChildren(); // this is the index to increment off of
    });
    
    // assuming this is some click event that adds the data it should
    function funct1(evt) { 
      var gameName = $('#nameInput').val(); 
      var medalCount = $('#medalsInput').val(); 
      var bool = $('#boolInput').is(':checked'); 
      firebaseData.child('/' + allDataCount).set({
         games: gameName, 
         medals: medalCount, 
         summergames: bool
      }); 
      allDataCount += 1; // increment since we still don't have the reference
    };
    

    有关在Firebase中管理列表的详细信息,Firebase API文档中有一篇很好的文章。 https://www.firebase.com/docs/managing-lists.html