Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularFire-$firebaseArray可以$add但不能读取_Javascript_Angularjs_Firebase - Fatal编程技术网

Javascript AngularFire-$firebaseArray可以$add但不能读取

Javascript AngularFire-$firebaseArray可以$add但不能读取,javascript,angularjs,firebase,Javascript,Angularjs,Firebase,我觉得我一定错过了一些非常基本的东西。以下是我服务的一部分: angular.module('fire') .constant('FIREBASE_URI', 'https://___.firebaseio.com/') .factory('syncArraySvc', function(FIREBASE_URI, $firebaseArray) { var buildingsUri = FIREBASE_URI + "buildings"; var building

我觉得我一定错过了一些非常基本的东西。以下是我服务的一部分:

angular.module('fire')
  .constant('FIREBASE_URI', 'https://___.firebaseio.com/')

  .factory('syncArraySvc', function(FIREBASE_URI, $firebaseArray) {

    var buildingsUri = FIREBASE_URI + "buildings";
    var buildings = $firebaseArray(new Firebase(buildingsUri));
    console.log(buildings);

    var getBuildings = function() {
      return buildings;
    };
    var addBuilding = function(item) {
      buildings.$add(item);
    };
    return {
      getBuildings: getBuildings,
      addBuilding: addBuilding
    };
  });
控制台。中间的日志只返回一个空数组。如果我尝试从另一个控制器调用syncArraySvc.getBuildings函数,我也会得到一个空数组。不知何故,$additem起作用,syncArraySvc.addBuildingitem也起作用。我缺少什么?

尝试在getBuildings函数中使用服务,或者更确切地说,在调用它时使用服务。返回数据可能需要一段时间。

尝试在getBuildings函数中使用服务,或者更确切地说,在调用它时使用服务。返回数据可能需要一段时间。

如果您查看$add$firebaseArray,它会创建新项目并将其添加到$firebaseArray中,就像我们有建筑物一样。但一旦您将项目添加到“`$firebaseArray`中,它就不会立即被添加。当$add承诺得到解决时,它就会被添加

我认为您做的是正确的,只需要在$add PROMITE成功时调用syncArraySvc.addBuildingitem方法

要使用这种方法,您需要从服务方法返回一个承诺,如

var addBuilding = function(item) {
  return buildings.$add(item);
};
然后调用者函数将接受这个承诺,在解决这个问题后,他将调用syncArraySvc.addBuildingitem方法,该方法确保items已添加到buildings数组中

如果您查看$add$firebaseArray,它确实会创建新项目并将其添加到$firebaseArray中,就像我们有建筑物一样。但一旦您将项目添加到“`$firebaseArray`中,它就不会立即被添加。当$add承诺得到解决时,它就会被添加

我认为您做的是正确的,只需要在$add PROMITE成功时调用syncArraySvc.addBuildingitem方法

要使用这种方法,您需要从服务方法返回一个承诺,如

var addBuilding = function(item) {
  return buildings.$add(item);
};
然后调用者函数将接受这个承诺,在解决这个问题后,他将调用syncArraySvc.addBuildingitem方法,该方法确保items已添加到buildings数组中


其他答案帮助我指出了正确的方向

具有一个似乎不需要将数据包装在承诺中的代码示例:

var list = $firebaseArray(new Firebase(URL));
$scope.list = list;
但是,它确实指出,您可以使用承诺在加载数据时收到通知。这就是我如何让它在我的项目中发挥作用的原因:

syncArraySvc.getBuildings().$loaded(function(data) {
  $scope.buildings = data;
});

我尝试在一个新的项目中复制它,它在没有$loaded包装器的情况下一直工作,就像第一个示例中所示。对我来说,需要$loaded包装是有道理的。我不明白在第一个例子中,如果没有它,它怎么会起作用。

其他答案帮助我指出了正确的方向

具有一个似乎不需要将数据包装在承诺中的代码示例:

var list = $firebaseArray(new Firebase(URL));
$scope.list = list;
但是,它确实指出,您可以使用承诺在加载数据时收到通知。这就是我如何让它在我的项目中发挥作用的原因:

syncArraySvc.getBuildings().$loaded(function(data) {
  $scope.buildings = data;
});

我尝试在一个新的项目中复制它,它在没有$loaded包装器的情况下一直工作,就像第一个示例中所示。对我来说,需要$loaded包装是有道理的。如果没有它,我不理解在第一个示例中它如何工作。

加载初始数据后,$loaded承诺将得到解决。当向数组中添加其他项时,它不会解析。您需要做的只是$scope.buildings=$firebaseArraynew firebaseBuildingURI。请不要使用console.log调试AngularFire数据,这很容易导致误解。相反,只需将其放在您的视图中:@FrankvanPuffelen我的上述回答将确保数据已添加或未添加..我相信它肯定会工作并显示更新的数据以正确扩展$firebaseArray,请阅读:@FrankvanPuffelen感谢有关调试的提示。几天后回到代码,我尝试使用建议的格式,它在视图中正确呈现,而console.log仍然返回空数组。如果您想将您的评论作为答案发布,我可以将其标记为正确,以便其他人可以看到实际问题所在。加载初始数据后,$loaded承诺将得到解决。当向数组中添加其他项时,它不会解析。您需要做的只是$scope.buildings=$firebaseArraynew firebaseBuildingURI。请不要使用console.log调试AngularFire数据,这很容易导致误解。相反,只需将其放在您的视图中:@FrankvanPuffelen我的上述回答将确保数据已添加或未添加..我相信它肯定会工作并显示更新的数据以正确扩展$firebaseArray,请阅读:@FrankvanPuffelen感谢有关调试的提示。几天后回到代码,我尝试使用建议的格式,它在视图中正确呈现,而console.log仍然返回空数组。如果你想把你的评论作为一个答案,我可以把它标记为正确的,这样其他人就可以看到实际问题的所在。