В течение жизни я не могу понять, как получить правильный вариант, выбранный на основе данных, возвращающихся из службы. «аттракционы» возвращаются точно, а div отображается правильно, но мой <select>
не обновляет или не отображает правильный предопределенный метод фильтра (то же самое для другого выбора для сортировки). Автоматический фильтр выполняется в службе и просто возвращает тип фильтра, когда его делается, чтобы иметь возможность обновлять HTML-выбор, чтобы он отображал пользователю, какой метод фильтра был выбран. но SELECT просто показывает неопределенный вариант.ng-select не обновлять жесткий список по умолчанию
Консоль печати в сервисе печатает "[], undefined, undefined", который сообщает мне, что выполняется до того, как обещание будет полностью возвращено. Однако, как только обещание будет полностью возвращено, $ 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 [] заполняется, а шаблон View обновляется (уже правильно отсортирован/filterd). rideFilter и rideSort также изначально возвращают undefined
в тот же console.log, но даже после того, как обновляется пользовательский интерфейс, $ scope.filter и $ scope.sort остаются пустыми. При первом вызове в службу Rides это происходит каждый раз ... но если я вручную обновляю Rides из представления пользовательского интерфейса, то до $ q даже запускает все обещания во второй раз, тогда я вижу $ scope.filter и $ scope. sort заполняет UIView-, который сообщает мне, что значения есть от 1-го вызова, и теперь они извлекаются из кеша при втором вызове, но до того, как он полностью обновит/изменит все значения.
Вы сказали, что «консольная распечатка в службах печатает» [], undefined, undefined ». Являются ли «аттракционы, rideFilter, rideSort» жестко запрограммированными? Вы также упоминали о «обещании», но я не вижу, чтобы вы использовали какие-либо обещания. Можете ли вы уточнить вопрос с большим количеством кода с вашего контроллера и службы. –
Пожалуйста, разместите свой код plunker – VjyV
все обновленный код – rolinger