【发布时间】:2018-01-30 20:51:41
【问题描述】:
我看过很多关于此的帖子,但由于某种原因,我继续遇到问题。我用 $q.all 返回多个承诺。每个返回的承诺(来自不同的供应商)都返回格式相同的对象数组。返回所有内容后,然后将所有内容处理为单个对象数组,然后我需要根据三个 SORT 值之一对对象数组进行排序:(vendor, price, price_estimate)
但是当它返回到我的控制器时,什么都没有排序。
Sample Object:
{
"vendor" : "Aaa Company",
"product" : "This prod",
"description" : "this cool prod",
"price" : 27.50,
"price_estimate" : 23.25,
"category" : "tool",
...
}
.factory('Products', function($http,$q,promise1,promise2,promise3,promise4,promise5) {
var prods = [] ;
function sortProds(key) {
prods.sort(function(a,b) {
if (key == "vendor") {
return ((x<y) ? -1 : ((x > y) ? 1: 0)) ;
} else {
return parseFloat(a.key) - parseFloat(b.key) ;
}
}) ;
}
function getProds() {
prods = [] ;
$q.all([promise1(),promise2(),promise3(),promise4(),promise5()]).then(function(response){
var z=0 ;
// process all results, ie: [0][{a:1,b:2,c:3},{a:4,b:5,c:6}], [1]:[{a:7,b:8,c:9}
for (var y=0;y<response.length;y++) {
// process individual result,ie: [{a:1,b:2,c:3},{a:4,b:5,c:6}]
for (var x=0;x<response[y].length;x++) {
response[y][x].prodID = z++ ; // reset prodID
prods.push(response[y][x]) ;
}
}
// sort option could be 'vendor','price','price_estimate'
prodInfo.sortBy = getDB("prod_sortOption") ;
sortProds(prodInfo.sortBy) ;
});
}
return {
all: function() {
return [prods,prodInfo.sortBy] ;
}
}
})
因为我不能让上面的工作,然后我尝试在控制器中自动排序返回的结果,但它也不起作用。在我的控制器中:
$scope.doSort = function(key,prodList) {
prodList.sort(function(a,b) {
var x = a[key]; var y = b[key] ;
if (key == "vendor") {
return ((x<y) ? -1 : ((x > y) ? 1: 0)) ;
} else {
return parseFloat(a.key) - parseFloat(b.key) ;
}
}) ;
return prodList ;
}
var returnedProds = Products.all() ;
$scope.prods = $scope.doSort(prodInfo.sortBy,returnedProds[0]) ;
// $scope.prods is what is used to in my template to populate the web view.
但是,如果 web 视图中的用户对具有 ng-click="doSort('price',prods)" 的按钮单击进行手动排序,它会按预期工作...但它与 doSort 相同,它无法处理自动排序的返回结果.
我希望这一切都有意义。我不知道为什么它不在服务中排序……或者在返回结果的自动排序期间再次排序……但是在手动完成时确实可以工作。啊!
【问题讨论】:
-
你的工厂里prodInfo是在哪里定义的?
-
plunker 或 codepen 链接在哪里可以重现问题?
标签: javascript arrays angularjs sorting javascript-objects