我觉得我必须遗漏一些非常基本的东西。这是我服务的一部分:
// 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)
一样有效。我错过了什么?
答案 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>在返回数据之前可能需要一些时间。