Чередование строк и первый/последний классы с mustache.js

Часто хочется обрабатывать первый и/или последний элементы в списке иначе, чем другие. есть ли способ сделать это с помощью усов? как насчет чередования строк?

(Очевидно, что всегда можно использовать jquery или что-то другое, чтобы применить класс css после обработки шаблона или что-то еще, но мне интересно, что-то еще на уровне шаблона.)

Ответ 1

Усы очень легкие, поэтому AFAIK не предоставляет эту функцию.

Вы можете использовать что-то подобное, чтобы получить четный/нечетный класс:

var view = {
  arr: ['one', 'two', 'three'],
  clazz: function() {
    return _counter++ % 2 == 0 ? 'even' : 'odd';
  }
};

var template = '{{#arr}}<span class="{{clazz}}">{{.}}</span>{{/arr}}';
Mustache.to_html(template, view);

Или сначала обработать данные, что-то вроде этого:

function preprocessArrayWithFirstLastClass(src) {
  var clazz;
  for (var i = 0; i < src.length; i++) {
    clazz = i % 2 == 0 ? 'even' : 'odd';
    if (i == 0) clazz += ' first';
    if (i == src.length - 1) clazz += ' last';
    src[i].clazz = clazz;
  }
}

var view = {
  arr: preprocessArrayWithFirstLastClass([{name: 'one'}, {name: 'two'}, {name: 'three'}])
};

var template = '{{#arr}}<span class="{{clazz}}">{{name}}</span>{{/arr}}';
Mustache.to_html(template, view);

Ответ 2

Я рекомендую сделать это с помощью чистого css/css3, не требуется js! Это кажется идеальным, когда материал, который вы пытаетесь сделать, не имеет отношения к контенту. Будущее сейчас!:

Строка строк Css:

использовать nth-child();

http://dev.opera.com/articles/view/zebra-striping-tables-with-css3/

Это не будет отображаться для ie7 и ie8 (http://caniuse.com/#search=nth-child), но они все равно получают контент, поэтому я считаю его победой.

Стилизация последнего элемента статического списка:

#nav li + li + li{
// Crazy styles on the 3rd li here!
}

(имеет хорошую поддержку: http://caniuse.com/#search=sibling)

Стилизация последнего элемента динамического списка

Использование: last-child.

div#test p:last-child {color: red;}
div#test p:first-child {text-decoration: underline;}

: last-child не поддерживается в ie7 и ie8 (http://caniuse.com/#search=last-child), поэтому будьте осторожны, что вы делаете что-то, что будет изящно деградировать здесь. Как ни странно: first-child is, так что вы можете, скажем, покрасить все элементы по умолчанию, а затем явно удалить их из первого дочернего элемента, и это действительно будет работать во всех браузерах.