私はangularjsを学ぼうとしていますが、Rest APIから返された配列にデータバインドしようとしてブロックにぶつかっています。 Personオブジェクトの配列を返す単純なAzure APIがあります。サービスのURLは http://testv1.cloudapp.net/test.svc/persons です。
私のコントローラーコードは次のようになります:
angular.module("ToDoApp", ["ngResource"]);
function TodoCtrl($scope, $resource) {
$scope.svc = $resource('http://testv1.cloudapp.net/test.svc/persons', {
callback: 'JSON_CALLBACK'
}, {
get: {
method: 'JSONP',
isArray: true
}
});
$scope.items = $scope.svc.get();
$scope.msg = "Hello World";
}
私のhtmlは次のようになります:
<html>
<head></head>
<body>
<div ng-app="ToDoApp">
<div ng-controller="TodoCtrl">
<h1>{{msg}}</h1>
<table class="table table-striped table-condensed table-hover">
<thead>
<th>Email</th>
<th>First Name</th>
<th>Last Name</th>
</thead>
<tbody>
<tr ng-repeat="item in items">
<td>{{item.Email}}</td>
<td>{{item.FirstName}}</td>
<td>{{item.LastName}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>
質問:上記のHTMLの表にデータが表示されていません。 FirebugでAPIの呼び出しを確認でき、APIからのJSON応答も確認できます。 REST apiへのデータバインディングが機能しない原因となっている私が間違って何をしていますか?
PS:JSFiddleがこの問題を示しています: http://jsfiddle.net/jbliss1234/FBLFK/4/
$ resourceサービスで配列を処理するには、queryメソッドを使用することをお勧めします。以下に示すように、クエリメソッドは配列を処理するために構築されています。
{ 'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'} };
この配列をスコープに戻すために使用する必要があるコードは次のとおりです。
angular.module("ToDoApp", ["ngResource"]);
function TodoCtrl($scope, $resource) {
var svc = $resource('http://testv1.cloudapp.net/test.svc/persons');
$scope.items = svc.query();
$scope.msg = "Hello World";
}
これは、REST APIが機能しており、配列を返すことを前提としています。
ドキュメントをさらに読むには
http://docs.angularjs.org/api/ngResource.$resource
Aleksanderが別のstackoverflow質問に与えた解決策の私の適応をクロスポストしたかっただけです https://stackoverflow.com/a/16387288/62681 :
methodName: {method:'GET', url: "/some/location/returning/array", transformResponse: function (data) {return {list: angular.fromJson(data)} }}
したがって、この関数を呼び出すと:
var tempData = ResourceName.methodName(function(){
console.log(tempData.list); // list will be the array in the expected format
});
複数のメソッド/リソースで配列を取得する必要がある場合、明らかにこれは少しかさばりますが、動作するようです。
オブジェクトがネストされている場合は、isArray paramを使用します。
angular.module('privilegeService', ['ngResource']).
factory('Privilege', function ($resource) {
return $resource('api/users/:userId/privileges',
{userId: '@id'},
{'query': {method:'GET', isArray:false}});
});
container.object.property
表記を使用して、オブジェクトとそのプロパティにアクセスできます。
JsonとRESTで同じ問題が発生しているかどうかはわかりませんが、この投稿は私の問題を解決しました: 文字列の配列がangular resource によって正しくレンダリングされない)
サーバーから取得した配列はクリーンな配列ではありませんが、いくつかの追加プロパティがあります。それはng-repeat
in
を使用して反復しても何も表示されません。
これらの余分なプロパティを無視する、サーバーからの配列を調べるには、特別なイテレーターが必要です。したがって、次のように、最初にforEach
を介して配列データを抽出します。
$scope.items = []
var response = $scope.svc.get();
angular.forEach(response, function(item) {
$scope.items.Push(item);
});
その後、あなたは行うことができます
<tr ng-repeat="item in items">
私は同様の問題を抱えていて、答えのどれも私にとってはうまくいきませんでした、私がしたことは次のとおりです:
$resource("/", {}, {
query: {
method: 'GET',
isArray: false,
transformResponse: function (data, headers) {
//if no data return so no warnings
if (data == ''){
return;
}
return {data: $.extend({}, eval("{" + data + '}'))};
}
}
});
Jqueryを使用します。基本的に、配列をオブジェクトに変換して、angularjsリソースがズボンをうんざりさせないようにします。