2013-08-22 2 views
3

В моей JavaScript У меня есть массивнг-варианты и уникальный фильтр не отображается angular.js

$scope.quoteList =   
    [ 
     { 
      select: false, 
      laymansDescription: "Nathan", 
      quoteNumber: "ING-70440-21", 
      version: "02", 
      quoteDate: "Feb 5,2013", 
      expirationDate: "Aug 5,2013", 
      internalNotes: "This quote is using test data", 
     }, 
     { 
      select: false, 
      laymansDescription: "Mitch", 
      quoteNumber: "ING-70440-01", 
      version: "02", 
      quoteDate: "Feb 5,2013", 
      expirationDate: "Aug 5,2013", 
      internalNotes: "This quote is using test data", 
     }, 
     { 
      select: false, 
      laymansDescription: "Stephen", 
      quoteNumber: "ING-70440-01", 
      version: "02", 
      quoteDate: "Feb 5,2013", 
      expirationDate: "Aug 5,2013", 
      internalNotes: "This quote is using test data", 
     } 
    ]; 

И я пытаюсь сделать селектор, который будет показывать только уникальные quoteNumbers т.е.. ING-70440-21 и ING-70440-01. Однако, когда я пытаюсь использовать «уникальный» вариант в угловом, ничего не появляется.

<select class="form-control" ng-options="quote.quoteNumber for quote in quoteList | unique:'quoteNumber'" ng-model="quoteModel1" /> 

Он отлично работает без единого тега. Что я делаю не так? Я довольно новичок в угловой, так что это может быть что-то очень простое.

+1

AngularJS не обеспечивает 'unique' фильтр. AngularUI делает. – AlwaysALearner

ответ

19

AngularJS не имеет встроенного фильтра unique. Вы можете сделать что-то вроде этого, чтобы сделать один из ваших собственных:

app.filter('unique', function() { 
    return function(input, key) { 
     var unique = {}; 
     var uniqueList = []; 
     for(var i = 0; i < input.length; i++){ 
      if(typeof unique[input[i][key]] == "undefined"){ 
       unique[input[i][key]] = ""; 
       uniqueList.push(input[i]); 
      } 
     } 
     return uniqueList; 
    }; 
}); 
+0

Это сработало. Благодаря! – MitchVz

+2

Добавить if (typeof input == 'undefined') {return;} после того, как функция открыта, чтобы избежать ошибок «undefined». –

+0

Это не сработало для меня .. –

4

Вы должны проверить angular-filter модуль и использовать uniqFilter

Пример:

JS:

function MainController ($scope) { 
    $scope.orders = [ 
    { id:1, customer: { name: 'John', id: 10 } }, 
    { id:2, customer: { name: 'William', id: 20 } }, 
    { id:3, customer: { name: 'John', id: 10 } }, 
    { id:4, customer: { name: 'William', id: 20 } }, 
    { id:5, customer: { name: 'Clive', id: 30 } } 
    ]; 
} 

HTML:

<th>Customer list:</th> 
<tr ng-repeat="order in orders | unique: 'customer.id'" > 
    <td> {{ order.customer.name }} , {{ order.customer.id }} </td> 
</tr> 

<!-- result: 
All customers list: 
John 10 
William 20 
Clive 30 
+1

Привет, Ариэль. Не могли бы вы отправить сценарий своего ответа? Я столкнулся с ошибкой '_ не определен'. Нужно ли включать какой-либо модуль для использования функции $ parse и _.uniq lodash? –

+0

В настоящее время я определенно рекомендую вам проверить [угловой фильтр] (https://github.com/a8m/angular-filter) и использовать [uniqFilter] (https://github.com/a8m/angular-filter#unique) – a8m

0

От углового UI

app.filter('unique', function() { 

    return function (items, filterOn) { 

    if (filterOn === false) { 
     return items; 
    } 

    if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) { 
     var hashCheck = {}, newItems = []; 

     var extractValueToCompare = function (item) { 
     if (angular.isObject(item) && angular.isString(filterOn)) { 
      return item[filterOn]; 
     } else { 
      return item; 
     } 
     }; 

     angular.forEach(items, function (item) { 
     var valueToCheck, isDuplicate = false; 

     for (var i = 0; i < newItems.length; i++) { 
      if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) { 
      isDuplicate = true; 
      break; 
      } 
     } 
     if (!isDuplicate) { 
      newItems.push(item); 
     } 

     }); 
     items = newItems; 
    } 
    return items; 
    }; 
});