如何在使用之前唤醒控制器?

时间:2017-05-13 09:11:27

标签: javascript angularjs

情况

我有一个带有主控制器'主视图'的离子侧菜单应用程序。每个选项卡都有自己的控制器,主控制器的子控件。当我启动应用程序时,第一个控制器启动并在“主视图”中显示来自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();
    }
});

}

1 个答案:

答案 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。