2016-10-04 5 views
0

В течение жизни я не могу понять, как получить правильный вариант, выбранный на основе данных, возвращающихся из службы. «аттракционы» возвращаются точно, а 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-го вызова, и теперь они извлекаются из кеша при втором вызове, но до того, как он полностью обновит/изменит все значения.

+0

Вы сказали, что «консольная распечатка в службах печатает» [], undefined, undefined ». Являются ли «аттракционы, rideFilter, rideSort» жестко запрограммированными? Вы также упоминали о «обещании», но я не вижу, чтобы вы использовали какие-либо обещания. Можете ли вы уточнить вопрос с большим количеством кода с вашего контроллера и службы. –

+0

Пожалуйста, разместите свой код plunker – VjyV

+0

все обновленный код – rolinger

ответ

0

Я предлагаю небольшое изменение (предполагая, что фильтр является тип езды):

удаляет событие на выбор:

<select id="rides_filterMenu" ng-model="filter"> 
    <option value="">All</option> 
    <option value="standard">Sedan</option> 
    <option value="suv">SUV</option> 
    <option value="limo">Limo</option>   
</select> 

, а затем, непосредственно на фильтр нг-повтора

<div ng-repeat="ride in rides | filter: { type: filter}"> 
    {{ride.name}} is a {{ride.type}} 
</div> 

 Смежные вопросы

  • Нет связанных вопросов^_^