2010-12-08 5 views
0

У меня есть простой список продуктов, где полоса зебры достигается с использованием метода cycle.Динамическая вставка предметов, втирающих полосу зебры

Вот продукт частичный:

<tr class="product <%= cycle 'odd', 'even' %>"> 
    <td><%= product.name %></td> 
    <td><%= product.price %></td> 
    <td><%= product.percentage %></td> 
    <td><%= link_to "Show", product %></td> 
    <td><%= link_to "Edit", edit_product_path(product), :remote => true %></td> 
    <td><%= link_to "Destroy", product, :confirm => 'Are you sure?', :method => :delete, :remote => true %></td> 
</tr> 

Однако, когда я динамически вставить другой продукт, метод цикла логически выбирает первый класс (в данном случае «нечетный» класс), таким образом, нарушая чередование до следующей перезагрузки. Хотя динамическая перезагрузка всего продукта будет работать; этот метод кажется несколько грязным и, скорее всего, будет беспорядочным с разбиением на страницы. Поскольку я по-прежнему относительно не знаком с JavaScript и прототипом, я не могу это сделать сам по себе, поэтому я должен спросить: есть ли способ получить класс предыдущего продукта («нечетный» или «четный») и соответственно добавить класс к вновь вставленному продукту?

Мой текущий UJS используется для вставки парциальное:

Modalbox.hide(); 

function insertProduct() { 
    $('products').insert({ top: "<%= escape_javascript(render @product) %>" }); 
    $$('.product').first().highlight(); 
} 

insertProduct.delay(0.8); 

Любая помощь будет оценена.

Заранее спасибо.

+0

Я еще не видел "UJS". Современные библиотеки построены на идеальном уровне, но многие забыли о «ненавязчивой» части. – clockworkgeek 2010-12-08 13:18:46

ответ

0

Ionut Staicu по существу прав, но забыл о прототипе. Окончательный ответ должен быть;

$$('.product').invoke('removeClassName', 'odd') 
       .invoke('removeClassName', 'even') 
       .first().highlight(); 
$$('.product:even').invoke('addClassName', 'even'); 
$$('.product:odd').invoke('addClassName', 'odd'); 
+0

Отлично ! Благодаря! Только небольшая проблема: когда вы создаете две записи сразу после друг друга, три лучших продукта получают класс «четный». – iconbakery 2010-12-08 13:03:48

1

После вставки элементов, вам необходимо удалить все класс odd и even:

$('tr.product').removeClass('odd even'); 

Затем вам нужно добавить классы снова:

$('tr.product:even').addClass('even'); 
$('tr.product:odd').addClass('odd'); 

так что код будет выглядеть следующим образом:

[...] 
$$('.product').first().highlight(); 
$('tr.product').removeClass('odd even'); 
$('tr.product:even').addClass('even'); 
$('tr.product:odd').addClass('odd'); 
} 
0

В jQuery я делаю это вот так:

$('#product-<%= @product.id %> ~ .product').each(function(index) { 
    $(this).toggleClass('odd'); 
    $(this).toggleClass('even'); 
}); 

Селектор говорит: найти продукт с идентификатором «продакт-XX», то для каждого следующего элемента, который имеет класс продукт, переключение класса четные и нечетные (удалить его, если он присутствует, и добавьте его, если это не).

+0

Как вы можете быть уверены, что вновь добавленному элементу будет присвоен правильный класс? Если было четное количество элементов до того, как новая строка будет нечетной, то будет переведено на четное, когда оно будет помещено в верхнюю часть списка. Кроме того, поскольку вы выбрали ответ в jQuery, вам не нужен цикл `each`, просто используйте` $ ('# ...'). ToggleClass ('odd'). ToggleClass ('even') ` – clockworkgeek 2010-12-08 12:40:58

0

Если бы я делал это, и если бы я мог рассчитывать на каждой строке быть фиксированной высоты, я бы, вероятно, использовать полосатую фоновое изображение вместо этого. Это не позволяет использовать разные цвета переднего плана или любое свойство CSS, чем фон. Тем не менее, это было бы очень надежно.

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