Javascript angularfire,对检索到的数据进行回调

Javascript angularfire,对检索到的数据进行回调,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,我想在取回firebase数据后调用一个函数,但是,我在ref对象上没有看到任何与之类似的函数。有什么建议吗?这是我的密码: angular.module('myMod', ['firebase']).controller('myCtrl', ['$scope', '$firebase', function($scope, $firebase) { var ref = new Firebase('myfirebaseurl'); $scope.data

我想在取回firebase数据后调用一个函数,但是,我在ref对象上没有看到任何与之类似的函数。有什么建议吗?这是我的密码:

angular.module('myMod', ['firebase']).controller('myCtrl', ['$scope', '$firebase',
    function($scope, $firebase) {
        var ref = new Firebase('myfirebaseurl');

        $scope.data = $firebase(ref);

        // i want to do something like
        data.then(function(){
           someFunc();
        });

        // or something like
        $scope.$watch('data', function(){
            if($scope.data.desiredProperty) {
              doSomething();
            }
        });
    }]);

AngularFire为“已加载”和“已更改”事件提供事件处理程序。从:

因此,您应该能够这样做:

var ref = new Firebase('myfirebaseurl');

$scope.data = $firebase(ref);

$scope.data.$on('loaded', function(){
    if($scope.data.desiredProperty) {
      doSomething();
    }
});
编辑:

看起来,当AngularFire
加载的
事件触发时,
$scope.data
对象尚未完全填充。这似乎是一个已知的问题,但有一些方法可以解决它

将数据作为参数访问到加载的
回调函数:

$scope.data.$on("loaded", function(data) {
  console.log(data);
}
完全跳过AngularFire,直接点击Firebase API:

ref.on("value", function(data) {
  console.log(data.val());
}

您需要使用$loaded和$watch承诺的组合来处理从Firebase返回的数据。有关更多信息,请查看

如果数据是对象,请尝试以下代码。观察集合中的变化有点不同,但基本上是一样的

angular.module('myMod', ['firebase'])
  .controller('myCtrl', ['$scope', '$firebase', function ($scope, $firebase) {

    var data = $firebase(new Firebase(URL));

    //to take an action after the data loads, use the $loaded() promise

    data.$loaded.then(function () {
        console.log("loaded record:", data.$id, data.otherData);
        someFunc();

    //Register an event listener which will be notified any time there is a change to the data.

        data.$watch(function (event) {
            console.log(event);
            if (data.desiredProperty) {
                doSomething();
            }
        });
    });

    //For three-way data bindings, bind it to the scope instead

    data.$bindTo($scope, "data");
}]);

我通常会使用一些AngularFire绑定,并将其与核心Firebase SDK提供的方法混合使用。

我在尝试使用AngularFire做所有事情时浪费了大量时间,而实际上大多数Firebase功能在没有它的情况下更容易实现

为满足您的要求,我建议如下:

var ref = new Firebase('myfirebaseurl');  // get your ref

// Called once with the initial data and again every time the data changes
ref.on("value", function(data) {
  $scope.data = data.val();
  someFunc();
});
上面的代码满足您的需要。检索数据时将调用一次,更新数据时将再次调用。如果只想在首次加载数据时调用该函数,可以使用:

ref.once("value", function(data) { ... }); 

我可以使用setTimeout在某一点后运行我的函数,但是我认为这不是一个好的解决方案,因为数据可以在不同的点上下降。这个解决方案对我不起作用,ref对象上没有识别$on函数。有趣的是,我想知道是版本问题还是Firebase数据中的某些内容与您的期望不符。我有一个工作的例子,以防它有帮助。你可以试着慢慢替换位,直到它断开为止,以找出问题所在。on函数似乎启动了,但如果我测试数据的属性,比如x(反映在db结构中),它总是返回未定义。啊,我明白你的意思了。看起来,
$firebase
服务有一个
$getIndex()
方法,该方法返回所有属性的数组。我已经用一些例子更新了我的plunk,说明如何使用该方法测试属性。我遇到了与OP相同的问题。这里和新AngularFire文档中描述的$on“loaded”承诺无法正常工作。我试图记录一个对象,它总是返回未定义的,即使它在$on内运行。如果我使用SetTimout并在3秒后调用它,我就会得到这个值。
ref.once("value", function(data) { ... });