Firebase - 对象与数组并返回 .key()

Firebase - Object vs Array and Returning a .key()

我正在使用 firebase + angularfire 进行一个项目,该项目涉及多个用户同时编辑数据(这将使对象成为理想对象)以及需要快速排序和过滤数据即时(阵列的理想选择)。 那么,对我来说是不是更好:

1) 使用 FirebaseObject 然后使用 angular toArray 过滤器进行排序

2) 使用 FirebaseArray 并确保使用 $add 以确保使用唯一 ID(甚至将推送 ID 存储为推送对象本身的 属性)。

目前,我们使用的是第二个选项,这引出了我的第二个问题: 当我使用 $push 时,如何 return 将 ref.key() 返回给控制器? 修改 API 指南中的示例:

var list = $firebaseArray(ref);
var addItem = function(itemDataObject) {
    list.$add(itemDataObject).then(function(ref) {
        var id = ref.key();
        console.log("added record with id " + id);
        list.$indexFor(id); // returns location in the array
    });
};

如何在调用 addItem 函数时让该 id 变量被 return 编辑?即使我在 list.$add 函数外声明一个变量并在函数内设置变量,我也会得到一个未定义的结果。

一个可能的问题似乎是 id 的变量声明,即使该变量是全局声明的。

例如:

var id;
function setIDVal1(){
  var id=10;
}

function setIDVal2(){
  id=101;    
}

function getIDVal(){
    alert(id);
}

查看此 fiddle for the local variable issue & check this fiddle 示例以获取 ID。

一种方法是回退到使用 Firebase 的常规 JavaScript SDK。

var list = $firebaseArray(ref);
var addItem = function(itemDataObject) {
    var newItemRef = ref.push(itemDataObject);
    var id = newItemRef.key();
    console.log("added (or still adding) record with id " + id);
    return id;
};

但是,如果您需要新参考的 key() 而不仅仅是显示它,则需要等到它可用。

在那种情况下,最简单的方法是 return 承诺:

var list = $firebaseArray(ref);
var addItem = function(itemDataObject) {
    return list.$add(itemDataObject);
};

接下来会发生什么,取决于调用代码和您希望它做什么。

由于您想 return 异步操作的结果,您可能会受益于阅读我的回答和其中的链接:Asynchronous access to an array in Firebase