对于我的一生,我无法弄清楚如何根据从服务返回的数据选择正确的选项。“游乐设施”返回得很好,并且 div 正在正确显示,但我<select>没有更新或显示正确的预定过滤方法(对于另一个选择进行排序也是如此)。自动过滤器发生在服务中,并在完成后简单地返回过滤器类型,以便能够更新 HTML 选择,以便向用户显示选择的过滤器方法。但 SELECT 只是显示一个未定义的选项。
服务中的控制台打印出“[],未定义,未定义”,这告诉我在完全返回承诺之前正在执行。但是,一旦完全返回承诺, $scope.rides 就会被定义为 DIV 填充得很好,那么为什么 SELECT 没有将正确的值传递给它呢?
HTML:
<select id="rides_filterMenu" ng-model="filter" ng-change="doFilter(filter);">
<option value="all">All</option>
<option value="standard">Sedan</option>
<option value="suv">SUV</option>
<option value="limo">Limo</option>
</select>
<div ng-repeat="ride in rides">
{{ride.name}} is a {{ride.type}}
</div>
控制器:
.controller('RidesCtrl', function($scope,$interval,Rides,constants) {
[$scope.rides,$scope.filter,$scope.sort] = Rides.all();
服务:
.factory('Rides', function($http,$q,servicesA,servicesB,servicesC,servicesD,servicesE,serviceF) {
var rides=[] ;
var rideFilter;
var rideSort ;
function sortRides(sortBy) {
// sort "rides" here before sending back to controller
}
function filterRides(filterBy) {
// filter "rides" here before sending back to controller
}
function getRides() {
rides = [] ;
var rideCount = 0 ;
$q.all([servicesA(),servicesB(),servicesC(),servicesD(),servicesE(),servicesF()]).then(function(response){
var z=0 ;
for (var y=0;y<response.length;y++) {
for (var x=0;x<response[y].length;x++) {
response[y][x].rideID = z++ ;
rides.push(response[y][x]) ;
if (response[y][x].isType == 1 || response[y][x].isType == 2) {
rideCount++ ;
}
}
}
//tInfo is a global var/obj
if (rideSort) {
sortRides(rideSort) ;
} else {
rideSort = getDB("userRidesSort") ;
sortRides(rideSort) ;
}
if (rideCount < 7) {
// override default filter if not enough services to show
rideFilter = "all" ;
filterRides(rideFilter) ;
} else {
if (tInfo.totalRiders > 7) {
// override default filter if too many passengers
rideFilter = "limo" ;
} else if (tInfo.filterManual == 1) {
// do nothing
} else {
// if not set, get it and set it.
rideFilter = getDB("userRidesFilter") ;
}
filterRides(rideFilter) ;
}
// prints to console with correct values
console.log("filter: "+rideFilter+ ", sort: " +rideSort) ;
});
}
getRides() ;
return {
all: function() {
// initially prints "[], undefined : undefined"
// but when $q finishes $scope.rides populates the UI View
// while $scope.filter & $scope.sort never update the UI View
console.log(rides+ "," +rideFilter + " : " +rideSort) ;
return [rides,rideFilter,rideSort] ;
}
上面console.log,rides 最初返回 [],但是当 $q 完成后,我可以看到rides[] 被填充并且模板视图被更新(已经正确排序/过滤)。RideFilter 和rideSort 最初也在undefined同一个console.log 中返回,但即使在更新了游乐设施UI 之后,$scope.filter 和$scope.sort 仍保持空白。在第一次调用服务 Rides 时,每次都会发生这种情况......但是如果我从 UI 视图手动刷新 Rides,在 $q 甚至第二次启动所有承诺之前,我会看到 $scope.filter 和 $scope。排序填充 UIView-它告诉我值从第一次调用开始,现在它们从缓存中检索,因为第二次调用开始但在它完全更新/更改所有值之前..