JavaScript函数更新Firebase数据,覆盖当前数据,即使使用我的循环检查空/空值
因此,我正在实现一个更新函数,以便我的用户可以更新他们的标题值。但是,如果其中一个空格留空,则数据将覆盖为数据库中的空字符串。我只想覆盖所需的数据,如果输入的长度为null或0,则不覆盖数据 JavaScript函数:JavaScript函数更新Firebase数据,覆盖当前数据,即使使用我的循环检查空/空值,javascript,json,firebase,firebase-realtime-database,Javascript,Json,Firebase,Firebase Realtime Database,因此,我正在实现一个更新函数,以便我的用户可以更新他们的标题值。但是,如果其中一个空格留空,则数据将覆盖为数据库中的空字符串。我只想覆盖所需的数据,如果输入的长度为null或0,则不覆盖数据 JavaScript函数: /*-----------------------------------UPDATE DATABASE DATA--------------------------------------------------------------*/ function getUpdat
/*-----------------------------------UPDATE DATABASE DATA--------------------------------------------------------------*/
function getUpdateId(element){
var postId = $(element).closest('div').attr('id');
console.log(postId);
var submit = document.getElementById("uploadButtonUpdate");
submit.onclick = function(){
var postData = {
title: $('#imageTitleUpdate').val(),
medium: $('#imageMediumUpdate').val(),
dimensions: $('#imageDimensionsUpdate').val(),
year: $('#imageYearUpdate').val(),
additional: $('#additionalInfoUpdate').val()
};
//Check if a json element is null
for (data in postData){
if(postData[data] != null){
firebase.database().ref().child('Posts/' + postId).update(postData);
}
}
location.reload();
}
}
在
onClick
函数中,您要做的是:
postData
对象for…in
循环中运行这个。那么会发生什么呢postData
中的第一个属性是否为null(根据您的代码),如果为null,则启动firebase函数以将数据发送到另一个线程(线程1)中的数据库,因为这是一个承诺;然后立即检查postData
中的下一个属性是否为null,如果不是,则启动firebase函数将数据发送到另一个线程(线程2)中的数据库,依此类推。。
当中的…的循环完成时,我们仍然在其他线程中运行firebase函数,为每个非空的属性值更新数据库路径。这就是为什么您在数据库中看到的内容存在问题
现在,我所做的是删除firebase调用并使其只运行一次。for…in
循环将检查具有错误值的数据,并告诉用户缺少某些内容,但如果没有缺少任何内容,它将仅用相关数据更新整个数据库路径一次
//Check if a json element is null
let aPropertyValueIsFalsy = false;
for (prop in postData) {
if (!!postData[prop]) {
aPropertyValueIsFalsy = true;
return;
}
}
if (aPropertyValueIsFalsy == true) {
// write code to tell user that something is missing
} else {
// send data to database
firebase
.database()
.ref()
.child("Posts/" + postId)
.update(postData);
}
Sudo_Kaizen说得对,当当前属性(postData[data])不为null时,为for循环的每次迭代调用update()函数。这是你的第一个问题
第二个也是更重要的问题,Sudo_Kaizen也犯了错误,那就是更新函数将更新您交给它的对象的所有属性,并且只有在所有属性都设置好的情况下才会发生异常
要使用非平凡值(例如null或0)保存字段,请按如下方式更改代码:
函数getUpdateId(元素){
var postId=$(元素)。最近的('div')。属性('id');
控制台日志(postId);
var submit=document.getElementById(“uploadButtonUpdate”);
submit.onclick=函数(){
var postData=[
{title:$('#imageTitleUpdate').val(),
{medium:$('#imageMediumUpdate').val()},
{dimensions:$('#imageDimensionsUpdate').val()},
{year:$('#imageYearUpdate').val()},
{附加:$('#additionalInfoUpdate').val()}
];
//检查json元素是否为空
for(postData的常量数据){
用于(数据中的常量属性){
if(数据[prop]!==null和数据[prop]!==0){
firebase.database();
}
}
}
location.reload();
};
}
不幸的是,现在这在我的数据库中添加了一个“data:”字段,无论我选择更新哪个特定数据。为了澄清,我在Json中的字段是:{Title:,Medium:,Year:,Dimensions:;}但是当尝试更新时,比如说“Title”,实际的Json值“Title”将保持不变,但是,编辑后的值将存储为数据中的{data:“我键入的内容”}。因此,它会添加一个新字段,而不是编辑我试图编辑的内容change@sazar97对不起,我的错。问题是,无法动态设置属性名称。我重构了答案,并使用了数组而不是字典。希望这一条对你有用…不幸的是,所有内容都被覆盖了。我尝试了其他一些方法,也尝试了你的方法,如果我选择将这些字段留空,数据仍然会被覆盖为空白。真的很令人沮丧,但我感谢你迄今为止的回复@sazar97真是太好了。。。是否可以使用调试器并检查if子句中的表达式是否在不应该执行时执行!?