Примените класс к каждому n-му элементу шаблона с Knockoutjs

Я экспериментировал с knockoutjs, перерабатывая существующий проект.

Мой текущий макет имеет логику для определения того, является ли отображаемый тег <div> первым или четвертым элементом.

if (index % 4 == 0) addClass('omega');
if (index % 4 == 1) addClass('alpha');

Есть ли какие-либо встроенные функции нокаута, которые могут шаблонировать подобные условия?


person John Giotta    schedule 18.03.2012    source источник


Ответы (1)


Несколько вариантов для вас:

Это будет выглядеть так:

//track an index on items in an observableArray
ko.observableArray.fn.indexed = function() {
   //whenever the array changes, make one loop to update the index on each
   this.subscribe(function(newValue) {
       if (newValue) {
           var item;
           for (var i = 0, j = newValue.length; i < j; i++) {
               item = newValue[i];
               if (!ko.isObservable(item.$index)) {
                  item.$index = ko.observable();
               }
               item.$index(i);      
           }
       }   
   }); 

   this.valueHasMutated(); 
   return this;
};

Вы должны инициализировать observableArray для индексации, например:

this.myArray = ko.observableArray().indexed();

Теперь, когда манипулируют наблюдаемым массивом, он сделает один проход по элементам и исправит индекс. Это лучше, чем внутри вашего foreach каждый раз искать индекс каждого элемента.

person RP Niemeyer    schedule 18.03.2012
comment
Спасибо, я уже видел эти параметры индексации. Я думаю, что моя проблема в том, что я ожидаю, что шаблоны изменят CSS на основе удаления элемента observableArray. - person John Giotta; 19.03.2012
comment
Индекс будет перестраиваться каждый раз, когда массив манипулируется (с помощью методов observableArray), поэтому, когда вы удаляете элемент, индекс будет обновляться. - person RP Niemeyer; 19.03.2012