使用自定义主干集合构建fuelux datagrid数据源

Posted

技术标签:

【中文标题】使用自定义主干集合构建fuelux datagrid数据源【英文标题】:Constructing fuelux datagrid datasource with custom backbone collection 【发布时间】:2013-03-23 18:27:05 【问题描述】:

我正在尝试构建启用排序、搜索和分页的数据网格。因此,我使用的是fuelux-datagrid。

我的主干视图如下所示:

var app = app || ;
$(function ($) 
'use strict';   

// The Players view
// ---------------
app.PlayersView = Backbone.View.extend(
    template: _.template( $("#player-template").html() ),
        initialize: function () 
        if(this.collection)
            this.collection.fetch();
        
        this.listenTo(this.collection, 'all', this.render);
    ,
    render: function ()            
        this.$el.html( this.template );
        var dataSource = new StaticDataSource(
            columns: [
                
                    property: 'playername',
                    label: 'Name',
                    sortable: true
                ,
                
                    property: 'age',
                    label: 'A',
                    sortable: true
                
            ],
            data: this.collection.toJSON(),
            delay: 250
        );

        $('#MyGrid').datagrid(
            dataSource: dataSource,
            stretchHeight: true
        );
    
);  
);

播放器模板只包含fuelux datagrid 中给出的模板。我的路由代码在某处将 app.playerview 实例化为

 new app.PlayersView(
            collection : new app.PlayersCollection
        ));

我的玩家收藏包含以下玩家型号列表

 [
  "id":1,
  "playername":"rahu",
  "age":13

 ,

  "id":2,
  "playername":"sahul",
  "age":18

,

  "id":3,
  "playername":"ahul",
  "age":19

 ]

我用列和数据方法构造数据源的数据源类/函数在datasource constructor中给出

但是,我收到错误“未定义的数据源”。有谁能够帮我? 我只是想破解代码,而不是在给定的示例中从本地 data.js 构造数据源,我想构造数据源以便它从 playercollection 获取数据。

另外,如何添加一个额外的列,以便我们可以将编辑标签放入其中,并且它应该能够在单击该编辑时编辑特定的行模型。

我一直在纠结这些。找出答案会很有帮助。

【问题讨论】:

您有没有尝试过***.com/a/15746153/33164 中建议的方法 - 这对您有何影响? @AdamAlexander,非常感谢您的指导。在您的指导下,我朝着正确的方向前进。我实际上没有正确设置数据源数据。我修改了 datasource.js 然后它工作了。我将发布修改后的代码。 【参考方案1】:

我一直在关注数据源。 我修改了数据源如下,然后它工作了。

var StaticDataSource = function (options) 
    this._formatter = options.formatter;
    this._columns = options.columns;
    this._delay = options.delay || 0;
    this._data = options.data;
;

StaticDataSource.prototype = 

    columns: function () 
        return this._columns;
    ,

    data: function (options, callback) 
        var self = this;

        setTimeout(function () 
            var data = $.extend(true, [], self._data);

            // SEARCHING
            if (options.search) 
                data = _.filter(data, function (item) 
                    var match = false;

                    _.each(item, function (prop) 
                        if (_.isString(prop) || _.isFinite(prop)) 
                            if (prop.toString().toLowerCase().indexOf(options.search.toLowerCase()) !== -1) match = true;
                        
                    );

                    return match;
                );
            

            // FILTERING
            if (options.filter) 
                data = _.filter(data, function (item) 
                    switch(options.filter.value) 
                        case 'lt5m':
                            if(item.population < 5000000) return true;
                            break;
                        case 'gte5m':
                            if(item.population >= 5000000) return true;
                            break;
                        default:
                            return true;
                            break;
                    
                );
            

            var count = data.length;

            // SORTING
            if (options.sortProperty) 
                data = _.sortBy(data, options.sortProperty);
                if (options.sortDirection === 'desc') data.reverse();
            

            // PAGING
            var startIndex = options.pageIndex * options.pageSize;
            var endIndex = startIndex + options.pageSize;
            var end = (endIndex > count) ? count : endIndex;
            var pages = Math.ceil(count / options.pageSize);
            var page = options.pageIndex + 1;
            var start = startIndex + 1;

            data = data.slice(startIndex, endIndex);

            if (self._formatter) self._formatter(data);

            callback( data: data, start: start, end: end, count: count, pages: pages, page: page );

        , this._delay)
    
;

事实上,我刚刚删除了以下代码及其相关的大括号。

(function (root, factory) 
if (typeof define === 'function' && define.amd) 
    define(['underscore'], factory);
 else 
    root.StaticDataSource = factory();

(this, function () 

我不知道上面的代码到底在做什么以及他们有什么依赖关系。

【讨论】:

以上是关于使用自定义主干集合构建fuelux datagrid数据源的主要内容,如果未能解决你的问题,请参考以下文章

《C#本质论》读书笔记(16)构建自定义集合

(相当复杂的)主干视图的最佳布局机制?

Backbone.js - 如何在模板中使用自定义模型属性?

未捕获的 ReferenceError:未定义主干

如何使用 StickIt 从主干中绑定长度。集合?

C# - 如何在不使用索引器的情况下获取自定义集合的第一项?