Приложете клас към всеки 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)


Няколко опции за вас:

  • работи се за добавяне на променлива $index, когато се прави foreach в KO. Това е планирано да бъде включено в KO 2.1. Заявката за изтегляне е тук: https://github.com/SteveSanderson/knockout/pull/182

  • тук има repeat свързване: https://github.com/mbest/knockout-repeat, което ви дава по-добър достъп до действителния индекс.

  • ако използвате observableArray, тогава има лесен начин да създадете индекс за всеки елемент.

Ще изглежда така:

//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