我有一个绑定到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"应用于表行。
但这种方法非常糟糕,因为它复制了行模板的整个标记。
什么是更好的方式来完成我需要的?
感谢
如果你只想更改替换行的样式,你可以在这里看到示例: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绑定(在我的示例中)来区分替换行
我能够通过使用"JQuery-eeven"选择器来实现这一点。我将代码添加到网格定义的数据绑定属性中。这是它的样子。
JAVASCRIPT
var myGridDefinition = {
columns: {...}
dataBound: {
$("#myGridId .k-grid-content tr:even").addClass("k-alt");
}
}
HTML
<div id="myGridId" data-bind="kendoGrid: myGridDefinition"></div>
还可以在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功能,但它抛出了错误,不知道为什么。但这个解决方案效果很好。