Angularjs 异步将数据加载到控制器中

Angularjs 异步将数据加载到控制器中,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,我目前正在学习AngularJS和类似的东西,今天我遇到了一个问题(可能是异步)。 我想做的是,使用一个角度工厂从Firebase获取一些数据,然后在控制器中使用这些数据 App.factory('Jobs', ['$firebaseObject', function($firebaseObject) { var ref = new Firebase('https://myapp.firebaseio.com/Jobs'); return $firebaseObject(ref); }]

我目前正在学习AngularJS和类似的东西,今天我遇到了一个问题(可能是异步)。 我想做的是,使用一个角度工厂从Firebase获取一些数据,然后在控制器中使用这些数据

App.factory('Jobs', ['$firebaseObject', function($firebaseObject) {
  var ref = new Firebase('https://myapp.firebaseio.com/Jobs');
  return $firebaseObject(ref);
}]);

App.controller('JobsController', ['$scope', 'Jobs', function($scope, Jobs) {
  Jobs.$bindTo($scope, 'allJobs');
  console.log($scope.allJobs);
}]);
这很好用。当我将
{{allJobs | json}}
放入模板中时,它会在几秒钟后更新。问题在于控制器
$scope.allJobs
返回未定义(可能是因为Firebase的响应比代码执行的时间晚)


我的问题是,如何编写它,以便我可以直接在控制器中访问$scope.allJobs?

您可以执行以下操作:

App.factory('Jobs', ["$firebaseObject",
function($firebaseObject) {
        // create a reference to the Firebase where we will store our data
        return function(url){

           var ref = new Firebase(url);
           // this uses AngularFire to create the synchronized array
           return $firebaseObject(ref);

        };
    }
  ]);
然后在控制器中:

App.controller('JobsController', ['$scope', 'Jobs', function($scope, Jobs) {
    $scope.allJobs = Jobs('https://myapp.firebaseio.com/Jobs');
    $scope.allJobs.$loaded().then();
}]);

这显示的是$loaded方法,而不是$bindTo。正如其他答案/评论所提到的,$bindTo可能是更好的方法。

参考此Firebase文档:

我可以做得很简单:

App.controller('JobsController', ['$scope', 'Jobs', function($scope, Jobs) {
  Jobs.$bindTo($scope, 'allJobs').then(function() {
    // now I have access to $scope.allJobs when everything is downloaded from Firebase
  });
}]);

答案取决于您想对
$scope.allJobs
执行什么操作。例如,如果您想显示它,答案是:“不要使用console.log,而是使用{{allJobs | json}”。但是,既然您已经使用了后者(+1赞成票):您想如何处理控制器中的
$scope.allJobs
?很抱歉,对于一个简单的操作,这是太多的代码了,过一会儿我会发布一个解决方案。我这样做工厂是为了让他可以通过任何firebase路径使工厂可重用。它可能会添加一行额外的代码,但更实用。我认为它不值得一个dow注意…这并不能回答问题。
所有作业
都是异步加载的,这就是问题所在。你是对的,我添加了$loaded来处理异步问题。我意识到$bindTo可能更好,但我总是成功地使用$loaded。只是显示了一个替代方案…如果你想要三方绑定,这才是正确的答案。否则,你会拒绝我们应该使用
$loaded()
@AnidMonsur是的,但我也在文档中读到,$loaded()应该只用于调试。我不知道。这是怎么说的?@AnidMonsur“也可以通过使用$loaded()在控制器中直接执行此操作。”方法。但是,应该小心使用此方法,因为它在初始加载后只调用一次。将其用于除调试以外的任何操作通常都是一种糟糕的做法。“谢谢。值得一提的是,
$bindTo()
在内部使用了
$loaded()
。我相信
$loaded()
只要您明白承诺只解决一次,就可以使用。