2017-05-13 3 views
1

状況

私はメインコントローラのメインビューを備えたイオンサイドメニューアプリを持っています。各タブは、それ自身のコントローラ、メインCtrlの子を持っています。アプリケーションを起動すると、最初のコントローラが起動し、Firebase DBからのデータがメインビューに表示されます。私の問題は、問題...私のタブ「顧客が」私が行くことをクリックする前にDB件のデータでいっぱいではありません、 コントローラを使用する前に目を覚ますには?

です...しかし、私はときので挙動は、本当に不思議ですこのタブをクリックすると、DBからの情報は表示されず、サイドメニューをクリックすると表示されるデータがロードされ、現時点では私のデータがタブにロードされます。しかし、前に、私は空のビューを取得...面白い事実は時々、一度10回それは動作します:私のページが正しくロードされています!

私は私の視点から

を試してみた何、私の「メインビュー」がロードされたときに、私の「顧客のコントローラが眠っているようだ、私はそのタブをクリックする前にそれを「目覚めさせる」ために別の方法を試してみましたページ。

私のメインコントローラから "開始"信号をブロードキャストしようとしましたが、$ scope上の私の 'customer'コントローラでそれを捕まえようとしましたが、機能上は$で動作しませんでした。

また、$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") { 
 
\t \t $scope.getCustomer(); 
 
    } 
 
}); 
 

 
}

答えて

0

あなたは顧客ビューのルート要素でNG-INITを使用し、「viewLoad」のような名前のメソッドにし、HTTPサービスを使用してviewLoad方法負荷データ内にそれをバインドすることができます示唆しています。その後、コールバック関数内forech後

移動この行を

$scope.listCustomer = $scope.newCustomer; 

$ scope.chatTmp。$ロードは、()内の$ HTTPサービスを使用していますか? $ httpサービスのコールバックトリガーのダイジェストサイクルのため、jquery ajax APIのような他のajax APIを使用している場合は、$ scope $をコールする必要があります。

+0

"viewLoad"関数は顧客のコントローラ内にあるはずですか?私は、HTTPサービスの前に、私は正確に私の場合は、特定のアドレスを読み込むことができます使用したことがない? – Memphis

+0

はい、あなたの2番目の質問については、このページをお読みください:https://docs.angularjs.org/api/ng/service/$http – tomcater

+0

「ng-init」の問題は、「viewLoad」機能を実行することですが、 DOMは以前にロードされていましたが、私の見解ではバインドされたデータはまだ見えません。 DOMバインディングの前に "ng-init"関数を実行する方法はありますか?または、メインのキャッシュから「顧客」コントローラをキャッシュにロードする方法はありますか? – Memphis

関連する問題