2016-09-23 17 views
0

私はこのコードをCartoDBで使用しています。そのJSライブラリを使用してクエリを実行し、いくつかのデータを返すと仮定します。私はいくつかの結果をに加えて、done()関数の中で動作します。 2番目のメソッドは、AngularJSのスコープ変数として結果を使用/設定しようとしますが、私はそれを失います。ここにいくつかのコード例があります。 編集:私の謝罪は、 "doesnt work"は、私はいつもmvcTotal = 0のデフォルト値を取得することを意味し、JS内で計算されるものとは異なる。AngularJSスコープ変数が約束内に設定されていません

angular.module('angMvcApp') 
    .controller('DataCtrl', ['$scope', '$routeParams', function ($scope, $routeParams) { 
    var borough = $routeParams.borough; 

    var sql = new cartodb.SQL({user: 'wkaravites'}); 
    var table = 'qiz3_axqb'; 
    var mvcTotal = 0; 

    if (borough != null) { 
     $scope.borough = borough; 
    } else { 
     $scope.borough = "Data Overview"; 

     sql.execute("select borough, count(*) from qiz3_axqb group by borough") 
     .done(function (data) { 
      $.each(data.rows, function (index, value) { 
      console.log("pizza: " +value['count']); 
      mvcTotal += value['count']; 
      //$('#' + value['borough'] + '').text(value['count']); 
      //$('#boroughList').append('<h2>' + value['borough'] + '</h2>'); 

      }); 
      //I see this correct 
      console.log(mvcTotal +" totals"); 

      //This doesn't work 
      $scope.mvcTotal = mvcTotal; 

     }) 
     .error(function (errors) { 
      // errors contains a list of errors 
      console.log("errors:" + errors); 
     }); 
     console.log(mvcTotal+" test test"); 

     //This doesn't work 
     $scope.mvcTotal = mvcTotal; 

     //This works 
     #scope.mvcTotal = 57; 

    } 


    }]); 

私は通常の変数をAngularスコープ変数にどのように変換していますか? JSコンソールをチェックすると、ピザ付きのログが表示され、最後に「合計」が付加された正しい番号が表示されます。ここで

は、HTMLビューである:あなたのDBの呼び出しから返されたデータをどうしたい

<div class="container"> 
    <div class="row"> 
    <div class="col-lg-12"> 
     <h1>{{borough}}</h1> 
     <p>{{mvcTotal}} motor vehicle collisions</p> 
    </div> 
    </div> 
</div> 
+0

クエリを実行する前に、$ scope.mvcTotalを一番上に定義しようとしています。例えば$ scope.mvcTotal; var sql = new cartodb.SQL({user: 'wkaravites'}); var table = 'qiz3_axqb'; var mvcTotal = 0; – user2085143

+0

「動作しません」があまりにも曖昧です。プログラムの期待される動作が何であるかはわかりません。 htmlビューに表示されないことを意味しますか? htmlビューを含める必要があります。 console.logメッセージが間違っているだけですか? –

答えて

0

何が行われ、関数内で行わなければなりません。私はあなたがそれを理解していると思いますが、あなたが欠けているのは操作の順序です。デバッガを使用して、コードが実行される実際の順序を確認します。

var sql = new cartodb.SQL({user: 'wkaravites'}); 

//step #1 
var mvcTotal = 0; 

    //step #2 
    sql.execute("select borough, count(*) from qiz3_axqb group by borough") 
    .done(function (data) { 
     //step #6 finally after DB responds this is called. mvcTotal is still 0 
     //$scope.mvcTotal is 57 
     $.each(data.rows, function (index, value) { 
     console.log("pizza: " +value['count']); 
     mvcTotal += value['count']; 


     }); 
     //step #7 now you get the correct total 
     console.log(mvcTotal +" totals"); 

     //step #8 this is correct. you can display this value in your html view as {{mvcTotal}} 
     $scope.mvcTotal = mvcTotal; 

    }) 


    //step #3 mvcTotal is still 0 
    console.log(mvcTotal+" test test"); 


    //step #4 mvcTotal is still 0 since DB call has not finished 
    $scope.mvcTotal = mvcTotal; 

    //step #5 previous value was 0, now it's 57 
    $scope.mvcTotal = 57; 
+0

私はそれを試みました、ただそれをDONE関数の中に入れて、mvcTotalのHTMLの値として0を得ました。また、より良い説明を入れてください。 – Zeratas

+0

奇妙なことに、それはランダムに動作し、時にはランダムに動作しません。 – Zeratas

+0

'sql.execute'文の下のコードを完全に削除します(手順3〜5)。それは物事を混乱させるだけです。 –

関連する問題