Angularjs Firebase&;中的异步数据请求存在问题;角火

Angularjs Firebase&;中的异步数据请求存在问题;角火,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,我有一个关于angular和Firebase异步加载的问题。 我有一个用户模型和一个语言模型;用户可以有多种语言,这意味着用户模型有一个名为“语言”的属性,即数组 我可以通过以下方式获取当前用户: $scope.user = User.findByUsername($routeParams.username) 一旦用户被加载,我就可以采取一些措施。我想采取的行动是找到 基于用户的语言ID从数据库中获取language对象。也就是说,我想说的不是“John user讲IDXXXXXX”,而是“J

我有一个关于angular和Firebase异步加载的问题。 我有一个用户模型和一个语言模型;用户可以有多种语言,这意味着用户模型有一个名为“语言”的属性,即数组

我可以通过以下方式获取当前用户:

$scope.user = User.findByUsername($routeParams.username)
一旦用户被加载,我就可以采取一些措施。我想采取的行动是找到 基于用户的语言ID从数据库中获取language对象。也就是说,我想说的不是“John user讲IDXXXXXX”,而是“John user讲英语”

$scope.user.$on('loaded', function(){
  angular.forEach($scope.user.languages, function(id){
    $scope.userLanguages[id] = Language.find(id);
  });
});
这有时有效,但并不总是有效。很明显,问题在于我用ID查找语言的方式——有时是超快速的,$scope。userLanguages[ID]表示某种东西,有时不够快,ID是“未定义的”。就像我需要为Language.find()添加另一个$on('loaded')侦听器一样。但随后我进入了一组复杂的嵌套侦听器,这似乎很疯狂

我错过了什么

// The basic structure of data in my Firebase database
languages
  -IDXXXXXXXX
      name: 'English',
      localName: 'English'
  -IDXXXXXXXX
      name: 'Spanish',
      localName: 'Espanol' 
users
  -SomeName
      username: 'Whatever',
      languages: [IDXXXX, IDXXXY, etc]
在构思我的问题时,我想到下面的方法可能会奏效。是的,但是把一美元放在另一美元里面感觉很奇怪。这是否表明我应该寻找一种更好的方法来构造数据和代码?或者也许它很好

$scope.user.$on('loaded', function(){
    angular.forEach($scope.user.languages, function(id){
      var lang = Language.find(id);
      lang.$on('loaded', function(){
        $scope.userLanguages[id] = Language.find(id);
        $scope.languages[id].selected = true;
      });
    });
  });

由于加载的
事件保证只调用一次,因此可以嵌套它们。但是,假设
Language.find
返回
$firebase
实例,则可能不需要它;您可以立即分配它;当数据到达时,它仍将更新

$scope.user.then(function() { // as of 0.7.2, this is equivalent to $on('loaded')
  angular.forEach($scope.user.languages, function(id) {
     $scope.userLanguages[id] = Language.find(id);
  });
});
需要记住的一点是,“已加载”事件只触发一次,因此如果用户的语言索引在将来发生更改,则
$scope.userLanguages
$scope.languages
都不会得到更新,因为这不会被实时监控

如果要添加实时监控,可以执行以下操作,而不是使用
loaded
事件:

$scope.user.$child('languages').$on('child_added', function(snap) {
   var id = snap.snapshot.name;
   $scope.userLanguages[id] = Language.find(id);
});

我只是稍微改变了我的问题,以显示一个可能的解决方案(在底部),你应该考虑在上面的代码中包含Language.find,因为这是行为的一个症结。