我正在使用MVC 4,Web API和Kendo UI控件构建网站。
在我的页面上,我使用Kendo UI Listview来过滤我的网格。我正在尝试添加“ALL”选项作为列表视图中的第一项。
以下是 listview :
var jobsfilter = $("#jobfilter").kendoListView({
selectable: "single",
loadOnDemand: false,
template: "<div class='pointercursor' id=${FilterId}>${FilterName}</div>",
dataSource: filterDataSource,
change: function (e) {
var itm = this.select().index(), dataItem = this.dataSource.view()[itm];
if (dataItem.FilterId !== 0) {
var $filter = new Array();
$filter.push({ field: "JobStatusId", operator: "eq", value: dataItem.FilterId });
jgrid.dataSource.filter($filter);
} else {
jgrid.dataSource.filter({});
}
}
});
这是我的数据源:
var filterDataSource = new kendo.data.DataSource({
transport: {
read: {
url: "api/Filter"
}
},
schema: {
model: { id: "FilterId" }
}
});
我尝试了几种不同的方法来实现这一目标:
根据我所读到的内容,我认为我应该能够在listview的dataBound事件中执行此操作并且我的实现不正确。这是添加了dataBound事件的listview,它崩溃了我的浏览器(Firefox) - 或者将大约50个“All”项添加到listview(IE)。
var jobsfilter = $("#jobfilter").kendoListView({
selectable: "single",
loadOnDemand: false,
template: "<div class='pointercursor' id=${FilterId}>${FilterName}</div>",
dataSource: {
transport: {
read: {
url: "api/Filter"
}
}
},
dataBound: function (e) {
var dsource = $("#jobfilter").data("kendoListView").dataSource;
dsource.insert(0, { FilterId: 0, FilterName: "All" });
e.preventDefault();
},
change: function (e) {
var itm = this.select().index(), dataItem = this.dataSource.view()[itm];
if (dataItem.FilterId !== 0) {
var $filter = new Array();
$filter.push({ field: "JobStatusId", operator: "eq", value: dataItem.FilterId });
jgrid.dataSource.filter($filter);
} else {
jgrid.dataSource.filter({});
}
}
});
非常感谢任何帮助。
答案 0 :(得分:2)
为什么不在服务器端添加它?
无论如何,如果你想在dataBound
中进行,只需检查它是否存在,只有在不存在时才添加:
dataBound: function (e) {
var dsource = this.dataSource;
if (dsource.at(0).FilterName !== "All") {
dsource.insert(0, {
FilterId: 0,
FilterName: "All"
});
}
},
作为您所看到的问题的解释:您创建了一个无限循环,因为在数据源中插入元素将触发更改事件,列表视图将再次刷新和绑定(因此触发dataBound
)。
您也可以将其封装在自定义小部件中:
(function ($, kendo) {
var ui = kendo.ui,
ListView = ui.ListView;
var CustomListView = ListView.extend({
init: function (element, options) {
// base call to widget initialization
ListView.fn.init.call(this, element, options);
this.dataSource.insert(0, {
FilterId: 0,
FilterName: "All"
});
},
options: {
name: "CustomListView"
}
});
ui.plugin(CustomListView);
})(window.jQuery, window.kendo);