Angularjs $ http.get()。然后绑定到一个列表

我有一个如下所示的列表:

<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方法,我得到三个空行,使计数确定,但没有信息显示。

我知道“everthing”别的作品,因为我以前用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方法返回一个不能被迭代的promise,所以你必须通过callback把结果附加到scopevariables上:

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

现在,由于只在获取结果后才定义documentsvariables,因此需要事先在作用域上初始化documentsvariables: $scope.documents = [] 。 否则,你的ng-repeat会呛。

这样,ng-repeat将首先返回一个空列表,因为documents数组一开始是空的,但是一旦收到结果,ng-repeat将再次运行,因为成功callback中的文档已经改变了。

此外,你可能想改变你ng-repeatexpression式为:

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

因为如果您的DisplayDocuments()函数正在调用服务器,则由于$ digest循环,此调用将被执行多次。

$http返回的承诺不能直接绑定(我不知道为什么)。 我使用的包装服务,完全适合我:

 .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中,auto-unwrap promise被移除了。 查看http://docs.angularjs.org/guide/migration#templates-no-longer-automatically-unwrap-promises

其实你在$http.getpromise

尝试使用随后的stream程:

 <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是你的arrays。

 $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()callback

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

但是现在由于Documents是一个数组而不是一个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>