25

使用 KnockoutJS 对列表进行条带化的最佳方法是什么?下面 div 上的类应该是偶数或奇数,具体取决于它在列表中的位置,并在添加或删除项目时更新。

<div class="Headlines loader" 
     data-bind="css: { loader: headlines().length == 0 }, 
                       template: { name: 'recentHeadlinesTemplate',
                                   foreach: beforeHeadlineAddition, 
                                   beforeRemove: function(elem) { $(elem).slideUp() },
                                   afterAdd: slideDown }">
</div>

<script type="text/html" id="recentHeadlinesTemplate">
    <div class="even">
        ${Title}
    </div>  
</script>
4

6 回答 6

58

我发现了一个在使用 foreach 迭代时返回索引的函数,因此您可以以相当紧凑的方式应用偶数和奇数类,例如:

<tr data-bind="css: { 'even': ($index() % 2 == 0) }">
于 2012-06-12T21:29:33.893 回答
21

不久前在 KO 论坛上有一个主题:https ://groups.google.com/d/topic/knockoutjs/cJ2_2QaIJdA/discussion

我的解决方案是自定义绑定。它有几个变化,但它基本上看起来像:

ko.bindingHandlers.stripe = {
    update: function(element, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor()); //creates the dependency
        var allBindings = allBindingsAccessor();
        var even = allBindings.evenClass;
        var odd = allBindings.oddClass;

        //update odd rows
        $(element).children(":nth-child(odd)").addClass(odd).removeClass(even);
        //update even rows
        $(element).children(":nth-child(even)").addClass(even).removeClass(odd);;
    }
}

并像这样使用:

<ul data-bind="template: { name: 'itemsTmpl', foreach: items }, stripe: items, evenClass: 'light', oddClass: 'dark'"></ul>

此处提供此绑定的 3 种变体示例:

http://jsfiddle.net/rniemeyer/HJ8zJ/

于 2011-06-22T12:51:31.773 回答
3

一种简单的方法是添加一个计算的 observable,它为每个元素添加一个索引,例如

    self.logLines = ko.observable(logLinesInput);

    self.enhancedLogLines = ko.computed(function() {
        var res = [];
        $.each(self.logLines(), function(index, ll) { 
             res.push(new LogLine(index, ll)); 
        });
        return res;
    }, self);

在我的例子LogLine()中,创建一个具有索引字段和原始对象中的其他字段的对象。

现在您可以轻松地将斑马条纹添加到输出中:

            <tr data-bind="css: { odd: (index % 2 == 1), even: (index % 2 == 0) }">
于 2012-04-07T07:01:17.817 回答
2

感谢您的有用帖子。我想提一下,css 可以很好地进行条带化,但嵌入的“if”似乎只在行渲染后才起作用。因此,使用 $index 或 css 奇/偶功能不会产生预期的结果。在不使用模板的情况下,我发现您可以将 KO 逻辑包装在行周围,以便在计算行之前发生逻辑。

<tbody data-bind="foreach: viewModel.configuration().items()"">
    <!-- ko if: $data.part() != '' -->
    <tr>
            <td data-bind="text: $index"></td><td  data-bind="text: $data.part()"></td>
    </tr>
    <!-- /ko -->
</tbody>
于 2012-10-27T13:29:00.897 回答
0

您可以使用模板中的{{if}}{{else}}条件语句来设置 div 的类。

此外,您需要扩展您的视图模型以包含一个返回当前项目索引的函数,该函数会告诉您它是奇数还是偶数。(像这样的东西

于 2011-06-22T12:46:16.227 回答
0

这是一个完整的例子:

<ul class="pickupPointHours" data-bind="foreach: Items">
 <li data-bind="css: { lineEven: ($index()%2 === 0), lineOdd: ($index()%2 === 1)}">
  <span class="pickupPointDay" data-bind="text: TextProperty"></span>
 </li>
</ul>
于 2012-08-24T14:44:51.167 回答