gpt4 book ai didi

javascript - Firebase 中数据对象的数字排序 ID

转载 作者:行者123 更新时间:2023-11-30 05:38:19 25 4
gpt4 key购买 nike

我是“游戏”的新手,想知道是否有可能以数字方式向 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)); };

问题:

最佳答案

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

  1. 对您的引用调用 .push() 将生成该唯一 ID。
  2. 调用 .set() 对您的引用将允许您使用自己的编号。

现在您正在使用 .push().set({}),因此 push 将生成一个新的 id,set 将简单地设置数据。

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

在不使用 .push() 的情况下使用 .set() 将允许您控制自己的 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

关于javascript - Firebase 中数据对象的数字排序 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22253111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com