Firebase 数组抓取在网页加载时未加载


// Movements Controller
app.controller("MovementsCtrl", ["$scope", "$rootScope", "$filter", "$timeout", "$route", function($scope, $rootScope, $filter, $timeout, $route) {
$rootScope.pageName = "Movements";
var date = new Date();
var currentDate = $filter('date')(new Date(), 'MM/dd/yyyy');
$scope.labels = [];
$scope.data = [];
$scope.recordsArray = []; // Converts records object into an array.
console.log($scope.recordsArray);
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
$rootScope.userID = user.uid;
// Run query to pull user records.
$timeout(function() {
var userID = $rootScope.userID;
var query = firebase.database().ref('/users/' + userID +'/movements/').orderByChild('created');
query.on("value", function(snapshot) {
$scope.records = snapshot.val();
angular.forEach($scope.records, function(element) {
$scope.recordsArray.push(element);
$scope.labels.push(element.name);
$scope.data.push(element.weight);
});
});
});
} else {
console.log("not signed in");
}
});
$scope.addRecord = function() {
console.log("Pushed");
var recordID = database.ref().push().key;
var userID = $rootScope.userID;
database.ref('users/' + userID + '/movements/' + recordID).set({
user: userID,
name: "Front Squat",
sets: 5,
reps: 5,
weight: 350,
created: currentDate
});
$route.reload();
}
}]);

由于某种原因,我的页面在 JS 中的数组加载之前加载,呈现一个空页面。 我尝试将所有内容包装在 init() 函数中并加载它,但仍然是相同的问题。 谁能帮我弄清楚如何事先预加载我的 JS 数组,或者有其他解决方案?

谢谢。

我的页面在数组之前加载的某种原因

作为 Firebase 方法的参数提供的函数由 Firebase API 保存,直到数据从服务器到达。这些函数以异步方式执行。这意味着它们在封闭函数完成后执行。

在AngularJS 框架及其摘要周期之外异步发生的对作用域的更改不会触发对 DOM 的更改。将事件引入 AngularJS 框架的一种技术是将 ES6 承诺转换为$q服务承诺:

firebase.auth().onAuthStateChanged(function(user) {
if (user) {
$rootScope.userID = user.uid;
// Run query to pull user records.
//$timeout(function() {
var userID = $rootScope.userID;
var query = firebase.database().ref('/users/' + userID +'/movements/').orderByChild('created');
//USE $q.when 
$q.when(query.once("value")).then(function(value) {
$scope.records = value;
angular.forEach($scope.records, function(element) {
$scope.recordsArray.push(element);
$scope.labels.push(element.name);
$scope.data.push(element.weight);
});
});
//});
} else {
console.log("not signed in");
}
});

使用与 AngularJS 框架及其摘要周期正确集成$q服务承诺。

$q.何时

将可能是值或(第三方)当时可承诺的对象包装为$q承诺。当您处理的对象可能是也可能不是承诺时,或者如果承诺来自不可信的源,这很有用。

-- AngularJS $q Service API 参考 - $q.when

最新更新