将“全部”项添加到由远程数据源填充的kendo ui listview

时间:2014-04-30 17:04:12

标签: javascript kendo-ui kendo-datasource kendo-listview

我正在使用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 事件中,则会导致 数据绑定事件进入循环并添加项目一堆(IE)或杀死浏览器(firefox)。添加preventDefault什么也没做。
  • 我已经阅读了将功能添加到读取参数的内容 数据源,但我认为这不是正确的地方 它。

根据我所读到的内容,我认为我应该能够在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({});
                }
            }
        });

非常感谢任何帮助。

1 个答案:

答案 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);