我对'游戏'很新,并且想知道是否可以通过数字方式将新添加的数据(通过表单和输入)订购到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)); };
问题:
答案 0 :(得分:1)
有两种方法可以为文档节点生成ID。
.push()
将生成该唯一ID。.set()
将允许您使用自己的
标识。现在您正在使用.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