我的应用程序是基于Angular JS构建的,并且在服务器上有很多AJAX请求。 例如,在PHP中,我将输出数组格式化为:
$dialog[$userId] = array(
'time' => $key,
'message' => $message['message'],
'name_user' => $info['name']
);
echo json_encode($dialog); die();
但是在Angular JS中,我得到的不是数组而是对象:
549:Objectid_user:" 549"消息:"你好" name_user:"阿里 阿赫梅多夫"时间:1432070505
如果使用ng-repeat
然后无法对对象进行排序的问题。
为什么在PHP中我设置数组但在客户端获取对象?
将对象转换为数组的简单方法是什么?因为我在AJAX页面上有很多对象。
答案 0 :(得分:11)
您不需要将对象转换为数组,以便在ng-repeat
中迭代它。您可以使用以下语法:
<div ng-repeat="(key, value) in items">{{key}} => {{value}}</div>
ngRepeat
的
很遗憾,此方法不适用于orderBy
过滤器。要按特定顺序迭代对象属性,您需要实现自己的过滤器。它可能是这样的:
<强>的JavaScript 强>
angular.module('app', []).
filter('orderByKey', ['$filter', function($filter) {
return function(items, field, reverse) {
var keys = $filter('orderBy')(Object.keys(items), field, reverse),
obj = {};
keys.forEach(function(key) {
obj[key] = items[key];
});
return obj;
};
}]);
<强> HTML 强>
<div ng-repeat="(key, value) in items | orderByKey:'-'">{{key}} => {{value}}</div>
<强> Plunker 强>
http://plnkr.co/edit/DJo0Y6GaOzSuoi202Hkj?p=preview
然而,即使这种方法只能从1.4.x
开始,因为正如文档中所述,1.4.x
之前的AngularJS将按字母顺序对对象属性进行排序,同时在{{1}中迭代它们}。
为了使其在Angular ngRepeat
甚至1.3.x
中工作,您可以执行将对象转换为对象数组,其中每个对象都包含1.2.x
和{{1} }属性。这样,您就可以在key
中结合包含value
的过滤器使用它。这是一个代码:
<强>的JavaScript 强>
ngRepeat
<强> HTML 强>
orderBy
<强> Plunker 强>
答案 1 :(得分:5)
假设你有一个像这样的对象:
$scope.myObj = {type:"Fiat", model:500, color:"white"};
然后,在您的角度Controller
中,您可以执行以下操作:
$scope.array = [];
angular.forEach($scope.myObj, function(element) {
$scope.array.push(element);
});
然后在HTML
<div ng-repeat="obj in array">{{obj}}</div>
以下是演示plunker
答案 2 :(得分:1)
orderBy
是一个过滤器,可过滤require an array。因此,直接的解决方案是将其与toArray
过滤器结合使用。假设您要使用time
属性订购对象:
<ol>
<li ng-repeat="value in objectWithValues | toArray | orderBy: 'time'">
{{value.name_user}} said <q>{{value.message}}</q> on {{value.time|date}}
</li>
</ol>
由于AngularJS未附带toArray
过滤器,您可以将其定义为:
angular.module('ToArrayDemo', [])
.filter('toArray', function() {
return function(obj) {
const result = [];
angular.forEach(obj, function(val) {
result.push(val);
});
return result;
}
});