Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript函数更新Firebase数据,覆盖当前数据,即使使用我的循环检查空/空值_Javascript_Json_Firebase_Firebase Realtime Database - Fatal编程技术网

JavaScript函数更新Firebase数据,覆盖当前数据,即使使用我的循环检查空/空值

JavaScript函数更新Firebase数据,覆盖当前数据,即使使用我的循环检查空/空值,javascript,json,firebase,firebase-realtime-database,Javascript,Json,Firebase,Firebase Realtime Database,因此,我正在实现一个更新函数,以便我的用户可以更新他们的标题值。但是,如果其中一个空格留空,则数据将覆盖为数据库中的空字符串。我只想覆盖所需的数据,如果输入的长度为null或0,则不覆盖数据 JavaScript函数: /*-----------------------------------UPDATE DATABASE DATA--------------------------------------------------------------*/ function getUpdat

因此,我正在实现一个更新函数,以便我的用户可以更新他们的标题值。但是,如果其中一个空格留空,则数据将覆盖为数据库中的空字符串。我只想覆盖所需的数据,如果输入的长度为null或0,则不覆盖数据

JavaScript函数:

/*-----------------------------------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
函数中,您要做的是:

  • 您可以从UI用户获取数据,并从中创建
    postData
    对象
  • 迭代对象的属性,检查其中是否有空值/缺少值(空值或未定义)
  • 这就是问题所在-您正在调用的firebase方法启动网络请求,没有人,甚至javascript,不知道该请求何时会返回响应/完成执行,因此,它将firebase函数发送到另一个线程,这样运行firebase函数就不会阻塞单线程javascript运行时。。但是,您正在一个非常快速的
    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子句中的表达式是否在不应该执行时执行!?