Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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_Angularjs_Firebase - Fatal编程技术网

Javascript 更新firebase中的嵌套对象

Javascript 更新firebase中的嵌套对象,javascript,angularjs,firebase,Javascript,Angularjs,Firebase,从Firebase注释中: 给定一个单键路径,如alanisawesome,updateChildren()仅更新第一个子级的数据,并且超出第一个子级传入的任何数据都被视为setValue()操作。多路径行为允许在不覆盖数据的情况下使用更长的路径(如alanisawesome/nickname)。这就是第一个示例与第二个示例不同的原因 我试图在代码中使用单个函数createOrUpdateData(object)。在更新的情况下,它会正确地更新第一级子对象,但如果传递了嵌套对象,则会删除该嵌套对

从Firebase注释中:

给定一个单键路径,如
alanisawesome
updateChildren()
仅更新第一个子级的数据,并且超出第一个子级传入的任何数据都被视为
setValue()
操作。多路径行为允许在不覆盖数据的情况下使用更长的路径(如
alanisawesome/nickname
)。这就是第一个示例与第二个示例不同的原因

我试图在代码中使用单个函数
createOrUpdateData(object)
。在更新的情况下,它会正确地更新第一级子对象,但如果传递了嵌套对象,则会删除该嵌套对象的所有其他属性

代码如下:

function saveUserDetails(email,object){
        var hashedEmail = Utilities.getHashCode(email);
        var userRef = ref.child(hashedEmail);
        return $q(function(resolve,reject){
            return userRef.update(object, function(error){
                if(error){
                    reject(error);
                }else{
                    resolve("Updated successfully!");
                }
            });
        });
    }
因此,如果我通过:

{
   name: 'Rohan Dalvi', 
   externalLinks: { 
      website: 'mywebsite'
   }
}
然后它将删除externalLinks对象内的其他属性。有没有更干净、更简单的方法来避免这种情况


简而言之,如何确保只更新嵌套对象而不删除数据。

您可以使用多路径更新

var userRef = ref.child(hashedEmail);
var updateObject = {
   name: 'Rohan Dalvi', 
   "externalLinks/website": 'mywebsite'
};
userRef.update(updateObject);
通过在对象文本中使用
“externalLinks/website”
语法,它将嵌套路径视为更新,而不是嵌套对象的集合这可以防止嵌套数据被删除。

提供了一个与cloud firestore一起使用的最新解决方案

可以使用“.”代替“/”:

var userRef=ref.child(hashedEmail);
var updateObject={
姓名:“Rohan Dalvi”,
“externalLinks.website”:“mywebsite”
};

userRef.update(updateObject)你好@DavidEast,谢谢它能工作!虽然我没有尝试更新嵌套对象中的数组。太棒了!谢谢我们如何使用动态对象名称来实现这一点?@OliverDixon和ES6可以使用计算属性名称,如下所示:
js const dynamicProperty='foo';const updateObject={name:'Rohan Dalvi',[dynamicProperty]:'mywebsite'}
您还可以将静态字符串与动态部分组合起来,如下所示:
js const updateObject={name:'Rohan Dalvi',[`externalLinks/${dynamicProperty}`]:'mywebsite'}我希望这有帮助!很抱歉设置了格式,我意识到堆栈溢出注释不是发布代码的最佳位置。使用此方法我收到以下错误:FirebaseError:Function DocumentReference.update()使用无效数据调用。无效的字段路径(外部链接/网站)。路径不能包含“~”、“*”、“/”、“[”或“]”I更新方式如下:this.db.collection('members').doc(uid).update(changes);