2016-12-01 21 views
0

データベースからデータを収集するスクリプトに問題があります。私は$ watchを使用したので、データのダウンロードが終了したらAngularに知らせたいと思います。残念ながら、それは動作しません。角度呼び出しは、change loadingComplete値の後ではなく、最初に機能します。

angular 
.module('app') 
.controller('tlmController', function($scope, $http) { 
    var vm    = this; 
    var data   = []; 
    vm.countTestLines = 0; 
    vm.loadingComplete = false; 

    $scope.$watch('vm.loadingComplete', function() { 
     console.log(data); 
    });  

    $http({ 
     method: 'GET', 
     url: 'app/server/tt/count_testlines.php' 
    }).then(function successCallback(response) { 
     vm.countTestLines = parseInt(response.data.count); 

     downloadInParts(data, 0, vm.countTestLines); 

    }, function errorCallback(response) { 
     console.log('error'); 
    }); 

    var downloadInParts = function(data, offset, max) {   
     if(max < offset) { 
      vm.loadingComplete = true; 
      return; 
     } 

     $http({ 
      method: 'GET', 
      url: 'app/server/tt/get_testlines.php', 
      params: { offset: offset } 
     }).then(function successCallback(response) { 
      data = data.concat(response.data);   
      downloadInParts(data, offset + 5, max); 
     }, function errorCallback(response) { 
      console.log('error'); 
     }); 


    } 

}); 
+0

私はAngularの男ではありませんが、newValueとoldValueをリスナーparamに '$ watch'メソッドに渡そうとしましたか?そしてそれに 'if(newValue!== oldValue)'をチェックして変更を処理することができます。 –

+0

以下の回答のいずれかがあなたの問題を解決した場合は、そのうちの1つを回答として受け入れることを検討してください。 – Danscho

答えて

0

問題はloadingCompleteが範囲の一部ではないということです。 $scope.loadingComplete;と宣言してください。

+0

はい、それはvm = thisのスコープの一部です! – Danscho

+0

私が知る限り、loadingCompleteはコントローラのプロパティになります。 watchを使用するには、loadCompleteは$ scopeオブジェクトのプロパティでなければなりません。 – asdadasfff

+0

必ずしもそうではありません。 controllerAs構文を使用している場合。このスタイルガイドを見てください:https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#style-y032 – Danscho

0

あなたはAngularJSのためJohnPapa's styleguideに応じて適切な方法であるvar vm = thisを、使用している場合は、にあなたの$ウォッチを書き換える必要があります。

$scope.$watch(function(){ return vm.loadingComplete }, function() { 
    console.log(data); 
}); 

コメントからの更新: あなたの関数パラメータdataは、あなたのdataを隠しますあなたのコントローラーからの変数。

+0

進捗状況が表示されますが、コンソールログは空の配列を返します(ただし、変数データは正しく埋められています)。 –

+0

loadingCompleteをtrueに設定してから、$ watchをトリガーしますか? – Danscho

+0

私は、ローカルデータ変数の代わりにvm.dataを使用しなければなりませんでした。なぜデータ変数が関数スコープ内に表示されるべきなのかわかりません。 –

0

'$ scope'ではなく 'vm'を使用しているので、あなたの関数に$ scope。$ applyを挿入する必要があります。

if(max < offset) { 
    vm.loadingComplete = true; 
    $scope.$apply(); 
    return; 
    } 

$スコープは常に値の変化を監視し、いずれかが存在する場合、角度は内部で$ダイジェスト()関数を呼び出しますし、変更した値が更新されます。 'vm'を使用すると、問題の原因となる値が更新されません。

関連する問題