AngularFire - $ firebaseArray可以加$但不读

时间:2015-06-19 17:15:13

标签: javascript angularjs firebase

我觉得我必须遗漏一些非常基本的东西。这是我服务的一部分:

// create a 2D array dynamically
int rows, columns, i, j;
int **matrix;
cin >> rows >> columns;
matrix = new int*[rows];
for(i=0; i<rows; i++)
   matrix[i] = new int[columns];

中间的console.log只返回一个空数组。如果我尝试从另一个控制器调用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()$add(item)一样有效。我错过了什么?

3 个答案:

答案 0 :(得分:3)

如果您查看$ add $firebaseArray,它确实会创建新项目&amp;将其添加到$firebaseArray,就像我们buildings一样。但是只要你将项目添加到``$ firebaseArray`它就不会立即添加。当$ add promise得到解决时,它会被添加。

我认为你做的是正确的事情,只有在syncArraySvc.addBuilding(item)承诺成功时你需要调用$add方法。

要实现此方法,您需要从服务方法返回承诺,例如

var addBuilding = function(item) {
  return buildings.$add(item);
};

然后调用者函数将接受该承诺,并且在解决它时,他将调用具有项目已添加到syncArraySvc.addBuilding(item)数组中的确定性的buildings方法。

syncArraySvc.addBuilding({foo: "bar"}).then(function(addedItem){
    console.log(addedItem);
    console.log(syncArraySvc.addBuilding(item)); //this will show you updated list
})

答案 1 :(得分:1)

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

API documentation有一个代码示例似乎不需要将数据包含在承诺中:

var list = $firebaseArray(new Firebase(URL));
$scope.list = list;

但是,它确实指出您可以使用$loaded承诺在加载数据时收到通知。这就是我在项目中的工作方式:

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

我尝试在一个新项目中复制它,并且它始终在没有$loaded包装器的情况下工作,就像它们在第一个示例中所示。对我来说,$loaded包装器是必需的。我不明白它如何在没有它的第一个例子中工作。

答案 2 :(得分:0)

尝试在getBuildings函数中使用$timeout服务,或者在调用时使用。{p>在返回数据之前可能需要一些时间。