Kendo网格,淘汰vm和行模板

时间:2013-12-08 19:00:51

标签: templates knockout.js kendo-ui kendo-grid knockout-kendo

我有一个绑定到ko vm的KendoUI网格

由于特定要求(某些列,链接等中的图标),我需要定义rowTemplate,我将其定义为ko模板。

但我也希望在不同的bg颜色中有正常和备用行。

因此我定义了两个相同的模板,如下所示

        <script id="rowTmpl" type="text/html">
            <tr role="row" >         
                <td align="center">
                    <a data-bind="attr: { href: 'scrccc_checkEdit.aspx?id=' + CheckID }" >
                        <img src="images/icon-edit.gif" border="0" alt="Edit/View Check" />
                    </a>
                </td>
                <td data-bind="text: CheckNumber"></td>
                ....
            </tr>
        </script>
        <script id="altTmpl" type="text/html">
            <tr class="k-alt" role="row">
                <td align="center">
                    <a data-bind="attr: { href: 'scrccc_checkEdit.aspx?id=' + CheckID }" >
                        <img src="images/icon-edit.gif" border="0" alt="Edit/View Check" />
                    </a>
                </td>
                <td data-bind="text: CheckNumber"></td>
                ....
            </tr>
        </script>

基本上两个模板是相同的,除了alt模板将class class =“k-alt”应用于表格行。

但是这种方法非常糟糕,因为它复制了行模板的整个标记。

什么是实现我需要的更好方法?

谢谢

3 个答案:

答案 0 :(得分:2)

如果您只想更改替代行的样式,可以在此处查看示例:http://jsfiddle.net/P5EQt/

HTML

<div data-bind="kendoGrid: { data: items, rowTemplate: 'rowTmpl', useKOTemplates: true }"> </div>
<button data-bind="click: addItem">Add Item</button>
<script id="rowTmpl" type="text/html">
    <tr data-bind="css:{strong:id%2===0}">
        <td data-bind="text: id"></td>
        <td>
            <input data-bind="value: name" />
        </td>
        <td>
            <a href="#" data-bind="click: $root.removeItem">x</a>
        </td>
    </tr>
</script>

的Javascript

var ViewModel = function() {
    this.items = ko.observableArray([
        { id: "1", name: ko.observable("apple")},
        { id: "2", name: ko.observable("orange")},
        { id: "3", name: ko.observable("banana")}
    ]);

    this.addItem = function() {
        var num = this.items().length + 1;
        this.items.push({ id: num, name: "new" + num});
    };

    this.removeItem = function(item) {
        this.items.remove(item);
    }.bind(this);
    };
ko.applyBindings(new ViewModel());

CSS

.strong { background-color:red; }

使用具有id(在我的样本中)条件的敲除css绑定来区分替代行

答案 1 :(得分:1)

我能够通过使用“JQuery even”选择器实现这一目标。我将代码添加到网格定义的数据绑定属性中。这就是它的样子。

JAVASCRIPT

    var myGridDefinition = {
        columns: {...}
        dataBound: {
            $("#myGridId .k-grid-content tr:even").addClass("k-alt");           
        }       
    }

HTML

    <div id="myGridId" data-bind="kendoGrid: myGridDefinition"></div>

答案 2 :(得分:0)

还可以在VM上创建AltRow属性和IsAltRow()方法,并使用css数据绑定功能。

var vm = function () {
    var self = this;    
    this.AltRow = true;
    this.IsAltRow = function () {
         self.AltRow = !self.AltRow;
         return self.AltRow;
    }
}

<script id="rowTmpl" type="text/html">                    
    <tr data-bind="css: { 'k-alt': $root.IsAltRow() === true }">
         <td>
              ...
         </td>                        
    </tr>
</script>

我也尝试使用KO的Computed Property功能,但它抛出了错误,不知道为什么。但是这个解决方案很好。