2

戻り値関数からJSONオブジェクトの配列を取得し、ng-repeatを使用してこの配列内をループしたいが、それは私のためには機能しない私のコード:

var app=angular.module("myApp",[]); 

app.controller("myController",function($scope,$http){ 

    $scope.listOfFields=[]; 

$scope.getlistOfFieldsByIdTable = function(idTable) 
    { 
     $http.get("/listOfFieldsByIdTable/"+idTable) 
     .success(function(data){ 

     return data; 

     }); 
    }; 

}); 

<!-- first call --> 
<!-- 150 is the id of the table--> 
<div class="panel-body" ng-app="myApp" ng-controller="myController"> 

    <ul ng-init="listOfFields = getlistOfFieldsByIdTable(150)"> 
     <li ng-repeat="field in listOfFields "> 
       {{field.name}} 
     </li> 
    </ul>       
</div> 

<!-- second call --> 

<div class="panel-body" ng-app="myApp" ng-controller="myController"> 
    <ul> 
     <lib ng-repeat="field in getlistOfFieldsByIdTable(150)"> 
         {{field.name}} 
     </li> 
    </ul> 
</div> 

私が使用した2つのコールが私のために働いていない私は「GoogleのChromeの拡張休憩クライアントプラグイン」のようなRestClientを使用したとき、私のサービスが正常に動作 あなたが適切に呼び出す方法を私を助けることができますオブジェクトの私の配列、および私のHTMLページに結果を表示、 ありがとうアドバンス。

+0

結果をget関数に記録します。何か手に入れますか? –

+0

あなたの応答のためにちょっと@JeremyJacksonありがとう、はい私は 機能を使用しました(エラー){ console.log( '何かが間違っていました'); });しかし、私はHTMLページで結果をレンダリングする方法で私の問題、関数内でエラーを取得しないでください:( – James

+0

それは問題ありませんが、あなただけのエラーを返す応答を記録してみてください。あなたは実際にデータをレンダリングするようになっています。また、コンソールで関数を呼び出して、何かが戻ってくるかどうかを調べてみてください。 –

答えて

1

この問題は、getlistOfFieldsByIdTableの機能にあります。

//WRONG 
    $scope.getlistOfFieldsByIdTable = function(idTable) 
     { 
      $http.get("/listOfFieldsByIdTable/"+idTable) 
      .success(function(data){ 

      return data; 
      }); 
     }; 

return dataステートメントは、.successメソッド内の匿名関数にデータを返します。親関数にデータを返しません。親レベルで戻り値が指定されていないため、返される値はnullです。返品はネスティングのあらゆるレベルで行う必要があります。

//BETTER 
$scope.getlistOfFieldsByIdTablePromise = function(idTable) { 

    var promise = $http.get("/listOfFieldsByIdTable/"+idTable); 

    var derivedPromise = promise.then(function onfulFilled(response) { 
     var data = response.data; 
     //Sets scope value asynchronously 
     $scope.listOfFieldsByIdTable = data; 
     //return value creates derived promise 
     return data; 
    }; 

    return derivedPromise; 
}; 

この例では、すべてのネストされたレベルでreturnステートメントがあるが、最後の項目が返さはありません。それは約束です。

$httpサービスは約束を返します。そして、約束オブジェクトに付けられたメソッドは、約束を返すだけです。 XHRが完了すると、データは副作用としてのみスコープ上に入り、操作は将来行われます。私のNGリピートで


、私はあなたがリターン機能で使用listOfFieldsByIdTableまたはderivedPromiseを使用する必要がありますか?

ng-repeatディレクティブでは、$scope.listOfFieldsByIdTable変数を使用します。 ng-repeatディレクティブは、ダイジェストサイクルごとに変更を確認する変数に$watchを置き、データが表示(または変更)されるとDOMを更新します。

コントローラ内のデータの追加処理を行うには、チェーン派生の約束から。

+0

あなたの時間とあなたの応答をありがとう、私はあなたの例については、私のng-repeat、私はlを使うべきですreturn関数で使用したistOfFieldsByIdTableまたはderivedPromise?ありがとうございました – James

+0

'$ scope.listOfFieldsByIdTable'を使用してください。追加の説明については、updateを参照してください。 – georgeawg

+0

ありがとう、それは私のために働く – James

0

あなたには、いくつかの非同期操作を実行している場合、あなたはリターンデータすることはできません、あなたはコールバックおよび/または約束との取引に持っているので。

function Service($http) { 

     this.getData =() => { 
     return new Promise((resolve, reject) => { 
      setTimeout(() => { 
      resolve([1,2,3,4,5]); 
      }, 1000); 
     }); 
     } 

    } 

そして、このようなコントローラでこのサービスを使用します:

function Controller($scope, Service) { 

    //Initialize our list 
    $scope.list = []; 

    //Call our promise 
    Service.getData().then((response) => { 
     //After 1s, retrieve the data 
     $scope.list = response 
     //Update the bindings 
     $scope.$apply(); 
    }); 

    } 

あなたが見ることができます例えば、私たちは約束を返すメソッドで、サービスを作成することができます

Working Plunker

+0

ちょっと@Paul Boutesは説明をありがとう(y) – James