2015-10-24 2 views
1

У меня есть таблица, в которой есть директива ng-repeat. Он использует фильтр для фильтрации объектов, не имеющих свойства qty> 0. Мне нужно дать серийный номер. к каждой из строк. Обратите внимание, что строки не фиксированы. Если пользователь изменяет количество товара, чтобы сделать его 0, он удаляется из таблицы.Число строк в ng-repeat

<table class="table table-striped"> 
    <tr> 
    <th>S.no</th><th>Product Name</th><th>Qty</th><th>Sub-Total</th> 
    </tr> 
    <tr class="orders" ng-repeat="product in products" ng-if="product.qty"> 
    <td>{{$index}}</td><td>{{product.name}}</td><td> <input type="number" min="0" ng-blur="product.qty = qty" ng-model="qty" value="{{product.qty}}"> </td> <td>{{product.qty*product.price | currency:"&#8377;"}}</td> 
    </tr> 
</table> 

Теперь проблема с этим кодом является то, что, то $index дает фактический индекс продукта в массиве продукции. Мне нужно, чтобы он указывал индекс в фильтрованном массиве. Как мне это сделать?

+0

Как я видел здесь http://stackoverflow.com/questions/20756694/angularjs-find-the- index-position-of-filter-value-in-the-original-array Вы можете попробовать этот продукт.indexOf (product) – Anfelipe

+0

@Anfelipe, который я могу получить через '$ index'. Мне нужны числа из 1 ... n для n строк, которые могут меняться, если пользователь вводит 0 как qty для любого продукта. –

ответ

1

Использование фильтра в ng-repeat:

HTML

<tr class="orders" ng-repeat="product in products | filter: hasQty"> 
    <td>{{$index}}</td><td>{{product.name}}</td><td> <input type="number" min="0" ng-blur="product.qty = qty" ng-model="qty" value="{{product.qty}}"> </td> <td>{{product.qty*product.price | currency:"&#8377;"}}</td> 
</tr> 

JS:

$scope.hasQty = function (value) { 
    return value.qty > 0 
} 

непроверенная.

+0

Спасибо. Оно работает. Я думаю, что 'ng-if' была проблемой. Это просто спрятало элементы. –

2

Вы можете фильтровать элементы заранее следующим образом:

<tr class="orders" ng-repeat="product in filterItems(products)"> 
    <td>{{$index}}</td><td>{{product.name}}</td><td> <input type="number" min="0" ng-blur="product.qty = qty" ng-model="qty" value="{{product.qty}}"> </td> <td>{{product.qty*product.price | currency:"&#8377;"}}</td> 
</tr> 

Контроллер:

$scope.filterItems = function(items) { 
    var filtered_items = []; 
    angular.forEach(items, function(item) { 
     if(item.qty > 0) { 
      filtered_items.push(item) 
     } 
    }) 
    return filtered_items; 
} 
+0

Возможно, также использовать функцию фильтра вместо forEach: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter – corgrath

+0

Спасибо за ссылку. –