【问题标题】:Firebase and AngularFire - $add in a array - unexpected behaviourFirebase 和 AngularFire - 数组中的 $add - 意外行为
【发布时间】:2015-06-10 16:16:52
【问题描述】:
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'});

根据文档,当我将 $add 与 $asArray 一起使用时,$add 应该执行“推送”。但相反,它创建的是哈希键而不是数字索引。

因此,dummy: 测试有一个包含哈希键的父级。预期是一个数字索引,我的意思是:数组项。

有人可以帮我吗?我在这个数据库方面只有 1 周的经验。

结果是这个……

 screens
 ...0
 .......days  
 ..........0
 ..........1
 ..........2
 .........-JrT5ZATDELIR3gXAvah
 ................dummy: test

【问题讨论】:

    标签: firebase angularfire firebase-realtime-database


    【解决方案1】:

    AngulareFire 基于 Firebase JavaScript SDK 构建。因此,当 AngularFire 的文档说它在内部使用 push 时,它不是指 JavaScript 的 Array.push,而是指 Firebase's push operation。并且 Firebase 的 push 会生成自己的键,它不会生成常规的数组索引。

    原因在Firebase's documentation on arrays 中得到了最好的解释,但基本上归结为:数组在分布式环境中不能很好地工作,因为所有客户端都必须同意array.length 才能能够添加新项目。

    所以$firebaseArray.$add会生成一个所谓的推送ID。它们是有序的,就像数组索引一样,但可以在客户端之间生成而没有冲突的风险。

    我注意到您使用的是较旧版本的 AngularFire。强烈推荐大家关注“官方”quickstart and guide for AngularFire

    【讨论】:

    • 泰,弗兰克!我更新了帖子以获得更好的可视化效果。它现在包含结果。 0,1,2 是当前记录...我正在尝试像数组一样添加键#3。但相反......它创建了一个哈希键并将我的虚拟对象作为孩子。我想说:数组中的记录已经存在。我只是想通过添加更多记录来“延续”这种时尚。看起来数组之前已经以某种方式创建过。继续为这个已经存在的数组添加记录的最佳方法是什么?
    【解决方案2】:

    我想发表评论,但我还没有足够的声誉,所以我在这里做。

    我眼中的解决方法很简单:

    代替:

    list.$add({dummy: 'Test'});
    

    做:

    list[index] = {dummy: 'Test'};
    

    【讨论】:

    • 嗨安德烈。这是应该避免的反模式。查看 AngularFire 指南部分,Saving Lists of Data,您可以在其中看到它被明确标记为反模式。看看博客文章,Best Practices: Arrays in Firebase。这与上面 Frank 的 answer 相矛盾,后者解释了为什么应避免使用常规数组索引。
    • 完全正确。但我并没有试图告诉他应该做什么,而是我回答了这个被问到的特定问题(我怎样才能继续这个数组)。在不了解完整情况的情况下,几乎不可能给出做某事的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多