来自Firebase说明:
给定var loader = new THREE.OBJMTLLoader();
loader.load(objModel, mtlModel, function(object) {
object.position.x = 20;
object.position.y = -20;
object.position.z = -100;
object.scale.set(10, 10, 10);
object.matrixAutoUpdate = false;
object.updateMatrix();
var testMat;
object.traverse( function ( child ) {
var object3d = child;
if(object3d instanceof THREE.Mesh){
testMat = new THREE.ShaderMaterial();
testMat.copy(object3d.material);
object3d.material = testMat;
object3d.geometry.computeFaceNormals();
object3d.geometry.computeTangents();
object3d.geometry.computeBoundingSphere();
}
});
});
之类的单一关键路径,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!");
}
});
});
}
然后它将删除externalLinks对象中的其他属性。是否有更简洁的方法来避免这种情况?
简而言之,我如何确保只更新嵌套对象并且不删除数据。
答案 0 :(得分:12)
您可以使用多路径更新。
var userRef = ref.child(hashedEmail);
var updateObject = {
name: 'Rohan Dalvi',
"externalLinks/website": 'mywebsite'
};
userRef.update(updateObject);
通过在对象文字中使用"externalLinks/website"
语法,它将嵌套路径视为更新,而不是嵌套对象的集合。 这可以防止嵌套数据被删除。
答案 1 :(得分:6)
This question提供了适用于Cloud Firestore的最新解决方案。
除了使用“ /”,还可以使用“。”代替:
var userRef = ref.child(hashedEmail);
var updateObject = {
name: 'Rohan Dalvi',
"externalLinks.website": 'mywebsite'
};
userRef.update(updateObject);