【问题标题】:Add an "All" item to kendo ui listview populated by a remote datasource将“全部”项添加到由远程数据源填充的 kendo ui 列表视图
【发布时间】:2014-04-30 17:04:12
【问题描述】:

我正在使用 MVC 4、Web API 和 Kendo UI 控件构建网站。

在我的页面上,我使用 Kendo UI Listview 来过滤我的网格。我正在尝试将“ALL”选项添加为列表视图中的第一项。

这是列表视图

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" }
            }
        });

我尝试了几种不同的方法来实现这一点:

  • 如果我将它附加到一个按钮上,我可以让它工作 - 但我需要它在那里 当数据加载。
  • 如果我将它添加到列表视图的 dataBound 事件中,它会导致 数据绑定事件进入循环并将项目添加到一堆(IE)或杀死浏览器(firefox)。添加 preventDefault 什么也没做。
  • 我已经阅读了向 Read 参数添加函数的内容 数据源,但我认为这根本不是正确的地方 它。

根据我的阅读,我认为我应该能够在 listview 的 dataBound 事件中做到这一点,并且我的实现不正确。这是添加了 dataBound 事件的列表视图,它使我的浏览器 (Firefox) 崩溃 - 或向列表视图 (IE) 添加了大约 50 个“全部”项目。

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({});
                }
            }
        });

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    你为什么不把它添加到服务器端呢? 无论如何,如果你想在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);
    

    【讨论】:

    • 我目前将它添加到服务器端,但我不喜欢这样做。 “全部”选择​​仅与 UI 操作相关,与来自服务器端的实际数据无关。在我看来,这意味着它不应该存在于来自服务器的数据中(尽管可以另外争论)。
    • 天哪,我现在觉得自己很笨,我从来没有想过在 0 时检查项目。
    • 好吧,从这个角度来看,您可能希望扩展 ListView 小部件并在 init 方法中添加项目 - 这样它就全部被封装了
    • 成功!感谢您指出我(现在)完全明显的遗漏。我意识到了无限循环问题 - 我显然被困在阻止事件冒泡而不是在执行前进行智能检查。
    • 我对 JavaScript、Kendo UI 和 jQuery 非常陌生,但我会考虑扩展小部件,因为这是处理它的合乎逻辑的方式。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多