javascript - 更新 firebase,无需重复

标签 javascript firebase

我是 firebase 的学习者,但对数据结构感到困惑。

我的数据结构如下

myApp--> news 

          --> K8ZqRIzrX6L3q-HjO8V --> title : "value title1"
                                  --> body : "value body1"
                                  --> ....

          --> K8ZqRJ1tI7onmoVX8G4 --> title : "value title2"
                                  --> body : "value body2"
                                  --> ....

现在我想将更多数据推送到 Firebase。我有如下对象:

 [{title: "value title2", body: "value body2", ...},{title: "value title3", body: "value body3", ...}]

我的对象有重复项。当我推送到 Firebase 时,它​​会添加带有新自动生成键的完整新对象。相反,我希望 firebase 仅更新新值并避免重复。

编辑: 我使用了 myFirebaseRef.push(),示例代码在这里,

                objNews.forEach(function(news){
                    myFirebaseRef.push(news,function(){
                    $('.result').append('<li><strong>' + news.title + '</strong></li>');
                    });   
                }); 

objNews 拥有新数据以及 Firebase 已有数据。我想要实现的是仅推送来自 ObjNews 的新数据,并避免使用 firebase 已有的数据。但是我的代码将 Object 中的所有数据推送到 firebase ,这会导致重复。

最佳答案

如果我理解正确的话,你有一个包含新闻文章的 JavaScript 数组:

[
  {title: "value title2", body: "value body2", ...},
  {title: "value title3", body: "value body3", ...}
]

您希望将此数组发送到 Firebase,然后能够更新数组中的值并将更新发送到 Firebase。

这是一种反模式,不要这样做!

诀窍在于了解哪个数组索引映射到 Firebase 中的哪个推送 ID。

var keysByIndex = {};
objNews.forEach(function(news, index){
    var newRef = myFirebaseRef.push(news);
    keysByIndex[index] = newRef.key();
});

现在您可以检查该对象是否已存储在 Firebase 中,如果是,请更新它:

var keysByIndex = {};
objNews.forEach(function(news, index){
    if (keysByIndex[index]) {
        var newRef = myFirebaseRef.push(news);
        keysByIndex[index] = newRef.key();
    }
    else {
        myFirebaseRef.child(keysByIndex[index]).update(news);
    }
});

这种方法存在大量的陷阱。

这是处理这种情况的更好方法。

强烈建议您采取相反的方法:在 Firebase 中进行所有写入操作,然后监听其中的数据数组。这有时称为单向流(因为所有数据都在单个连续循环中流动)或 command-query segregation principle

它的工作原理如下:

your app                        Firebase
                                  +-+
 -------- send write command -->  | |
 +-+                              | |
 |s|                              |s|
 |t|                              |t|
 |a|                              |a|
 |t|  <-- listen for changes ---  |t|
 |e|                              |e|
 +-+                              | |
                                  +-+

在此场景中,本地应用程序状态(场景中的 objNews)来自对 Firebase 的监听。所有更改都会写入 Firebase,而不是本地数组。

关于如何使用它的一小段内容。我将只创建/更新 DOM 元素,因为这也是您的代码所做的事情:

myFirebaseRef.on('child_added', function(snapshot) {
  // a news article was added, add it to the HTML
  var key = snapshot.key();
  var news = snapshot.val();
  $('.result').append('<li id="'+key+'"><strong>' + news.title + '</strong></li>');
})
myFirebaseRef.on('child_changed', function(snapshot) {
  // a news article was changed, update the HTML for it 
  var key = snapshot.key();
  var news = snapshot.val();
  $('#'+key).html('<li id="'+key+'"><strong>' + news.title + '</strong></li>');
})
myFirebaseRef.on('child_removed', function(snapshot) {
  // a news article was remove, remove the HTML for it 
  var key = snapshot.key();
  var element = document.getElementById(key);
  element.parentNode.removeChild(element);
})

我的 jQuery 有点生疏,所以其中可能存在一些语法错误。

关于javascript - 更新 firebase,无需重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944694/

相关文章:

java - 如何隐藏浏览器检查器中的字段

javascript - Angular 项目加载两次,但只是有时

javascript - 为什么 $http.put 在 AngularJS 中不起作用?

node.js - 使用 auth.user().onCreate 时无法读取未定义的属性 'uid'

javascript - 如何使用 jQuery 获取重复表单中的字段值?

javascript - 按下按钮时隐藏的复选框出现(正确),但再次按下时不会消失

android - 在通知点击时打开特定应用程序

android - Firebase 值事件监听器

java - 无法使用 ValueEventListener 从 Firebase 检索数据

ios - 使用段错误 :11 error 从 Firebase 添加 AdMob