次のようなリストがあります。
<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,…}
$ 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サイクルのためにこの呼び出しが何度も実行されるためです。
$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 を参照してください
実際、$http.get
でpromise
を取得します。
フォローされたフローを使用してみてください:
<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);
});
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>