在推送到Firebase阵列时写入预定的节点ID

时间:2017-11-09 15:55:24

标签: javascript arrays loops firebase firebase-realtime-database

此问题之前已被问过,但所提供的解决方案似乎都无法解决我的问题:

我在Firebase上有一系列数据,我在我的应用中循环生成内容,使用" for"循环,因此索引值。这适用于预定的数据集,因为ID是简单的数组数字,但是当用户添加一些新数据(使用push()添加到数组中时),firebase会创建一个唯一的节点密钥(例如-KyWRU7RRCE_V1w_OiZx)由于某种原因阻止我的循环工作的新数据集(控制台中没有显示错误)。

如果我去firebase并手动确保新数据集具有数值,则循环再次开始工作。如何使用当用户将新数据推送到数组时,生成的密钥是数字?我试过这个:

  // Push new routine to Firebase.
  var firebaseRef = firebase.database().ref();
  var createdExercise = JSON.parse(localStorage.newRoutine);
  $("#save").click(function()
  {
    firebaseRef.child("workouts").key(some_indexed_value).push(createdExercise);
  });

但是控制台返回以下错误:Uncaught TypeError:firebaseRef.child(...)。key不是函数。

如果它有用,这是我正在使用的循环:

// Initialize Firebase.
firebase.initializeApp(config);
// Reference data.
var dbRef = firebase.database().ref().child("workouts");
// Sync with Firebase in real time.
dbRef.on("value", snap =>
{
  var workouts = snap.val();

  for (var i = 0; i < workouts.length; i++)
  {
    var routine = workouts[i].title;
    var time = 3;
    var exercises = workouts[i].exercises;
    var icons;

    $("#cardList").append(createCards(routine));
  }
});

我在Firebase上的JSON数据图片:Firebase JSON tree

1 个答案:

答案 0 :(得分:1)

回答你的问题是使用.set()代替.push()这样的

firebaseRef.child("workouts").child(some_indexed_value).set(createdExercise);

这将使用您的自定义键在锻炼下创建一个节点。

但建议使用push keys并使用forEach()方法获取结果,而不是使用for loop