我有一个带有主控制器'主视图'的离子侧菜单应用程序。每个选项卡都有自己的控制器,主控制器的子控件。当我启动应用程序时,第一个控制器启动并在“主视图”中显示来自Firebase数据库的数据。我的问题是,在我点击进入...之前,我的标签“客户”没有填满数据库数据。
...但是行为真的很奇怪,因为当我点击这个标签'customer'时,没有显示DB的信息,加载数据我需要点击侧面菜单,它出现了,只是此时我的数据已加载到我的标签中!但之前,我得到一个空洞的观点......有趣的事实是,有时,它曾经十次有效:我的页面正确加载!
从我的观点来看,当我的'主视图'被加载时,我的'客户'控制器似乎处于睡眠状态,所以我尝试了不同的方法来“唤醒”它,然后点击它的标签页。
我试图从我的主控制器广播一个“开始”信号,然后在我的“客户”控制器上用$ scope. $ on函数捕获它,但它没有用。
还尝试了$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams)
,它适用于后退按钮,但不能在应用启动时加载视图。
即使我将之前的$on
功能更改为$scope.$on('$ionicView.enter', function()
,也会产生相同的结果。
问题可能来自于我在“客户”标签中加载数据的方式,因为它是一个firebase调用,所以可能是同步请求问题?
我想要实现的是,当我的应用程序启动时,所有控制器都被加载(但这会修复同步请求问题吗?)或者只是在我点击选项卡时有一个正常的行为。在“客户”选项卡DOM中单击=正常数据加载。
// Customer controller
function ($scope, $stateParams, $firebase, $firebaseArray, $state, $ionicPopup, $location)
{
$scope.getCustomer = function()
{
$scope.listCustomer = "";
$scope.newCustomer = [];
var user = firebase.auth().currentUser;
var refCustomer = firebase.database().ref("customers/"+user.uid+"/orders/");
$scope.orderTmp = $firebaseArray(refCustomer);
$scope.chatTmp.$loaded().then(function()
{
angular.forEach($scope.orderTmp, function(order)
{
var refOrderHist = firebase.database().ref("History/"+order.$id);
refOrderHist.once('value').then(function(snapshot)
{
if(snapshot.val() === null)
{
refOrderHist.child(order.$id).remove();
refCustomer.child(order.$id).remove();
}
else
{
$scope.newCustomer.push(snapshot.val());
}
});
});
});
$scope.listCustomer = $scope.newCustomer;
};
// I'm usigin this $on for the back button
$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
if ($location.path() === "/side-menu/customer") {
$scope.getCustomer();
}
});
}
答案 0 :(得分:0)
建议您可以在客户视图根元素中使用ng-init,并将其绑定到名为" viewLoad"和viewLoad内部方法使用http服务加载数据。
在forech内部移动此行然后回调函数
$scope.listCustomer = $scope.newCustomer;
$ scope.chatTmp。$ loaded()使用$ http服务吗?因为$ http服务回调触发摘要周期,如果它使用其他ajax API如jquery ajax API,那么你必须调用$ scope。$ apply by your self inside success callback。