Javascript 如何在Firebase web app中插入新的子数据?

Javascript 如何在Firebase web app中插入新的子数据?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在构建一个简单的汽车数据库应用程序。当用户添加新车时,它会为库创建以下JSON数据,并带有空白字段: { "name": "Cars", "gallery": [{ "img": "http://", "title": "BMW" }, { "img": "http://", "title": "Lexus" }, { "img": "http://", "titl

我正在构建一个简单的汽车数据库应用程序。当用户添加新车时,它会为库创建以下JSON数据,并带有空白字段:

{
    "name": "Cars",
    "gallery": [{
        "img": "http://",
        "title": "BMW"
    }, {
        "img": "http://",
        "title": "Lexus"
    }, {
        "img": "http://",
        "title": "Ferrari"
    }],
    "pageId": "23",
    "storeURL": "/app/cars/gallery"
}
现在我想在应用程序中做的是,如果用户添加了新的画廊图片,它应该在最后一张画廊图片之后添加新的子图片。所以在法拉利之后应该插入一个新的物体。我似乎无法做到这一点,因为每个教程都会导致一个死胡同,而且谷歌官方文档指定
set()
将替换所有数据,因此如果使用
update()
,它将添加数据,而在这种情况下,它不会添加数据

此代码删除所有数据:

function add(){
  var data = [
    {
      title: 'Mercedes',
      img: 'http://'
    }
  ]
  var postData = {
    pageGallery: data
  };
  var updates = {};
  updates['/app/cars/'] = postData;
  firebase.database().ref().update(updates);
  console.log('New car added');

}
如果我更改并添加子项:

firebase.database().ref().child('gallery').update(updates);

它不做任何事情来处理数据。你能帮忙吗?

请看这篇关于许多人的博文。现在读吧,我在这里等你

欢迎回来。既然您知道了当前方法将导致痛苦的原因,那么让我们看看您应该如何对这些数据进行建模。这篇博文已经向您介绍了推送ID,它是Firebase对类似阵列的集合的大规模可扩展、离线准备的方法

正如我们的解释,您可以通过调用
push()
将项目添加到列表中

因此,如果这创造了一辆汽车:

function addStore(){
  var rootRef = firebase.database().ref();
  var storesRef = rootRef.child('app/cars');
  var newStoreRef = storesRef.push();
  newStoreRef.set({
    name: "Cars",
    "pageId": "23",
    "storeURL": "/app/cars/gallery"
  });
}
然后,要将图像添加到该商店的图库中,请执行以下操作:

var newCarRef = newStoreRef.child('gallery').push();
newCarRef.set({
  title: 'Mercedes',
  img: 'http://'
})

这将在库的末尾添加一个新的汽车/图像(如果库还不存在,则创建库)。

如果有人需要错误处理:

          var rootRef = firebase.database().ref();
          var storesRef = rootRef.child('Lorelle/Visitors');
          var newStoreRef = storesRef.push();
          newStoreRef.set($scope.CarModal,
            function(error) {
              //NOTE: this completion has a bug, I need to fix.
              if (error) {
                   console.log("Data could not be saved." + error);
                   Materialize.toast('Error: Failed to Submit' + error, 2000);
              } else {
                 console.log("Data saved successfully.");
                 Materialize.toast('Data Submitted, Thank You.', 2000);

                   }
                });
             }

首先,谢谢你的评论。听到一位真正的谷歌开发者的话,我感到非常谦卑。关于答案,你是正确的;在使用密钥时,我将尝试使用Firebase最佳实践。谢谢(不过,我仍然喜欢数组的老式方法)您可以用JSON对象{name:“Cars”,“pageId:“23”,“storeURL:“/app/Cars/gallery”}替换$scope.CarModal,它将非常有效。纯JS现在很少见。