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