2012-01-15 2 views
18

Как я могу контролировать foreach, чтобы игнорировать некоторые элементы, используя сравнение?Knockout.js foreach: но только при сравнении true

То, что я хочу, например, что-то вроде этого:

<div data-bind="foreach: entry where (entry.number > 10)"> 

Так что я хотел бы, чтобы это сделать петлю через entry-х, но только выполнить, когда этот ток entry имеет number значение более чем на 10 .

Это возможно?

ответ

23

В настоящее время это невозможно с knockout.js, но это интересная функция. Вы должны подать отчет об ошибке/связаться с автором, чтобы рассмотреть его для будущей версии.

Способ 1:

<div data-bind="foreach: entry"> 
    <div data-bind="if: entry.number > 10"></div> 
</div> 

Способ 2:
Написать метод пользовательского фильтра, который дает вам множество элементов, которые соответствуют вашим условиям и использовать это в вашем foreach.

+0

Я следовал ** Путь 1 **, прежде чем ответить, в качестве альтернативы - предположим, что я буду придерживаться его. Благодаря! – LouwHopley

+0

Нет проблем, я как-то знал, что это обычный способ, но все равно включил его: D –

17

попробовать это:

<div data-bind="foreach: editingItem.columns"> 
     <!-- ko if: Selected--> 
     <div data-bind="text: Name"></div> 
      <input type="text"/> 
      <!-- /ko --> 
+0

Привет @JustMe, хороший ответ Я не заметил сначала, пока не сделал некоторые исследования. Важно отметить, что привязка if может работать внутри комментария. http://knockoutjs.com/documentation/if-binding.html Также может быть хорошей идеей изменить ваш ответ, чтобы он применил конкретно к вопросу, например. используйте «entry.number» таким образом, чтобы было легче увидеть, как оно применяется для решения проблемы. –

+0

Спасибо @AlexKey Я новичок в KnockoutJS, и я прошел учебник, и они очень полезны. – JustMe

+0

Идеально подходит для фильтрации строк таблицы. – Rake36

4

насчет

<div data-bind="foreach: _.filter(entry(), function(item) { return item.number > 10;})"> 

с использованием underscore.js

+0

Ницца! Подчеркивание - да-бомба – skrile

6

Я думаю, что было бы лучше использовать встроенный метод arrayFilter (см http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html)

viewModel.filteredEntries = ko.computed(function() { 

    return ko.utils.arrayFilter(this.entries(), function(item) { 
     return item.number > 10; 
    }); 

}, viewModel); 

Тогда вы можете просто привязать данные к фильтруемым элементам, как обычно,

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