我正在编写一个小型 Angular Web 应用程序,在加载数据时遇到了问题。我使用 Firebase 作为数据源,发现 AngularFire 项目听起来不错。但是,我无法控制数据的显示方式。
起初,我尝试通过执行以下操作来使用常规隐式同步:
angularFire(ref, $scope, 'items');
当我在视图中使用模型 $items 时,它运行良好并且所有数据都显示出来了。但是,当数据来自 Firebase 数据源时,它的格式不是视图支持的方式,因此我需要在数据显示之前对数据进行一些额外的结构更改。问题是,我不知道数据何时已完全加载。我尝试将 $watch 分配给 $items,但它被调用得太早了。
所以,我继续前进并尝试使用 angularfireCollection 代替:
$scope.items = angularFireCollection(new Firebase(url), optionalCallbackOnInitialLoad);
文档不太清楚“optionalCallbackOnInitialLoad”的作用和调用时间,但尝试访问 $items 集合中的第一项将引发错误(“Uncaught TypeError: Cannot read property '0' of undefined”) .
我尝试添加一个按钮,并在按钮的单击处理程序中记录了 $items 中第一项的内容,并且它起作用了:
console.log($scope.items[0]);
就在那里!我的 Firebase 中的第一个对象显示时没有任何错误……唯一的问题是我必须单击一个按钮才能到达那里。
那么,有谁知道我如何知道所有数据何时已加载,然后将其分配给 $scope 变量以显示在我的视图中?还是有其他方法?
我的控制器:
app.controller('MyController', ['$scope', 'angularFireCollection',
function MyController($scope, angularFireCollection) {
$scope.start = function()
{
var ref = new Firebase('https://url.firebaseio.com/days');
console.log("start");
console.log("before load?");
$scope.items = angularFireCollection(ref, function()
{
console.log("loaded?");
console.log($scope.items[0]); //undefined
});
console.log("start() out");
};
$scope.start();
//wait for changes
$scope.$watch('items', function() {
console.log("items watch");
console.log($scope.items[0]); //undefined
});
$scope.testData = function()
{
console.log($scope.items[0].properties); //not undefined
};
}
]);
我的观点:
<button ng-click="testData()">Is the data loaded yet?</button>
提前致谢!