Firebase和AngularFire-数组中的$add-意外行为
根据文档,当我将$add与$asArray一起使用时,$add应该进行“推送”。而是创建一个散列键,而不是一个数字索引 因此,dummy:test有一个包含哈希键的父级。预期的是一个数字索引,我的意思是:数组项 有人能给我一些帮助吗?我在这个数据库只有一周的经验 结果是这个Firebase和AngularFire-数组中的$add-意外行为,firebase,angularfire,firebase-realtime-database,Firebase,Angularfire,Firebase Realtime Database,根据文档,当我将$add与$asArray一起使用时,$add应该进行“推送”。而是创建一个散列键,而不是一个数字索引 因此,dummy:test有一个包含哈希键的父级。预期的是一个数字索引,我的意思是:数组项 有人能给我一些帮助吗?我在这个数据库只有一周的经验 结果是这个 dayPath = ref.path.toString() + '/' + configId + '/screens/' + screenIndex + '/days/',
dayPath = ref.path.toString() + '/' + configId + '/screens/' + screenIndex + '/days/',
// the ref for the days object
daysRef = fbutil.ref(dayPath),
// the sync for the days object
daysSync = fbutil.syncObjectReference(daysRef);
// the collection as a $firebase array
var list = daysSync.$asArray(),
items = [],
number;
console.log(list);
list.$add({dummy: 'Test'});
AngulareFire构建在Firebase JavaScript SDK上。因此,当AngularFire的文档说它在内部使用
push
时,它不是指JavaScript的Array.push,而是指。Firebase的push
生成自己的键,但不生成常规数组索引
原因在中得到了最好的解释,但基本上归结为:阵列在分布式环境中无法正常工作,因为所有客户端都必须对阵列的长度达成一致意见,才能添加新项。
因此,$firebaseArray.$add
将生成一个所谓的推送ID。它们是有序的,就像数组索引一样,但可以跨客户端生成,而不会产生冲突风险
我注意到你使用的是AngularFire的旧版本。我强烈建议您遵循“官方”的说法。我想发表评论,但我还没有足够的声誉,所以我在这里发表评论
我眼中的解决方案非常简单:
而不是:
screens
...0
.......days
..........0
..........1
..........2
.........-JrT5ZATDELIR3gXAvah
................dummy: test
做:
泰,弗兰克!我更新了这篇文章,以便更好地观想。它现在包含结果。0,1,2是当前记录…我正在尝试添加一个像数组一样的键#3。但是,相反,它创建一个散列键并将我的虚拟对象作为子对象。我想说的是:数组中的记录已经存在。我只是想通过添加更多的唱片来“延续”这种时尚。看起来这些数组以前是以某种方式创建的。继续为这个已经存在的数组添加记录的最佳方法是什么?嗨,安德烈。这是应该避免的反模式。查看AngularFire指南部分,您可以看到它清楚地标记为反模式。看看这篇博文。这与上面Frank的解释相矛盾,Frank解释了为什么应该避免使用规则数组索引。完全正确。但我并不是想告诉他应该做什么,而是回答了一个特别的问题(我怎样才能继续数组)。如果不了解整个情况,几乎不可能给出做某事的最佳方式。
list.$add({dummy: 'Test'});
list[index] = {dummy: 'Test'};