web-dev-qa-db-ja.com

Angularjs $ http.get()。thenおよびリストへのバインド

次のようなリストがあります。

<li ng-repeat="document in DisplayDocuments()" ng-class="IsFiltered(document.Filtered)">
    <span><input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" /></span>
    <span>{{document.Name}}</span>
</li>

コントローラーのこのリストをこれにバインドします。

$scope.Documents = $http.get('/Documents/DocumentsList/' + caseId).then(function(result) {
    return result.data;
});

これを実行すると、結果が得られません。 thenメソッドを削除すると、3つの空の行が表示され、カウントはOKになりますが、情報は表示されません。

以前はリストにjQueryを入力していたので、他の「すべて」が機能することを知っていますが、何が間違っていますか?

サーバーからの応答は次のとおりです。

{Id:3f597acf-a026-45c5-8508-bc2383bc8c12, Name:ZZ_BL0164_Skisse BL0164_945111.pdf, Order:1,…}
{Id:46f51f1f-02eb-449a-9824-8633e8ae7f31, Name:ZB_BL0201_Firmaattest BL0201_945111.pdf, Order:1,…}
{Id:fddd1979-c917-4b32-9b83-b315f66984ed, Name:ZA_BL0228_Legitimasjonsskjema BL0228_945111.pdf,…}
50
ruffen

$ httpメソッドはプロミスを返しますが、これは反復できないため、コールバックを介してスコープ変数に結果を添付する必要があります。

$scope.documents = [];
$http.get('/Documents/DocumentsList/' + caseId)
  .then(function(result) {
    $scope.documents = result.data;
});

これで、結果がフェッチされた後にのみdocuments変数を定義するため、事前にスコープのdocuments変数を初期化する必要があります:$scope.documents = []。そうしないと、ng-repeatがチョークします。

この方法では、最初にdocuments配列が空であるため、ng-repeatは最初に空のリストを返しますが、結果が受信されるとすぐにng-repeatが再び実行されます。折り返し電話。

また、ng-repeat式を次のように変更することもできます。

<li ng-repeat="document in documents" ng-class="IsFiltered(document.Filtered)">

DisplayDocuments()関数がサーバーへの呼び出しを行っている場合、$ digestサイクルのためにこの呼び出しが何度も実行されるためです。

54
Stewie

$httpから返されたPromiseは直接バインドできません(理由は正確にはわかりません)。私は完璧に機能するラッピングサービスを使用しています。

.factory('DocumentsList', function($http, $q){
    var d = $q.defer();
    $http.get('/DocumentsList').success(function(data){
        d.resolve(data);
    });
    return d.promise;
});

コントローラーでバインドします:

function Ctrl($scope, DocumentsList) {
    $scope.Documents = DocumentsList;
    ...
}

UPDATE!:

Angular 1.2では、自動展開プロミスが削除されました。 http://docs.angularjs.org/guide/migration#templates-no-longer-automatically-unwrap-promises を参照してください

26
vitalets

実際、$http.getpromiseを取得します。

フォローされたフローを使用してみてください:

<li ng-repeat="document in documents" ng-class="IsFiltered(document.Filtered)">
    <span><input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" /></span>
    <span>{{document.Name}}</span>
</li>

documentsは配列です。

$scope.documents = [];

$http.get('/Documents/DocumentsList/' + caseId).then(function(result) {
    result.data.forEach(function(val, i) { 
        $scope.documents.Push(/* put data here*/);
    });
}, function(error) {
    alert(error.message);
});                       
6
Maxim Shoustin

success()コールバックを使用してみてください

$http.get('/Documents/DocumentsList/' + caseId).success(function (result) {
    $scope.Documents = result;
});

しかし、今ではDocumentsは配列であり、約束ではないので、()を削除します

<li ng-repeat="document in Documents" ng-class="IsFiltered(document.Filtered)"> <span>
           <input type="checkbox" name="docChecked" id="doc_{{document.Id}}" ng-model="document.Filtered" />
        </span>
 <span>{{document.Name}}</span>

</li>
1
Mark Coleman