将列添加到 dstore 支持的 dgrid

Posted

技术标签:

【中文标题】将列添加到 dstore 支持的 dgrid【英文标题】:Adding a column to a dstore backed dgrid 【发布时间】:2016-02-22 03:00:06 【问题描述】:

我有一个包含五列的网格 - 用户名、电子邮件、启用、锁定和删除。

用户名、电子邮件、启用和锁定均来自服务器。 Remove 是一个客户端元素,用于指示应该删除一行。

我想在加载网格内容时在客户端的 store 中注入默认值 remove,或者在用户与 CheckBox 小部件交互时设置它。

如何捕获从服务器请求对象的代码并添加另一列?

或者,有没有更好的方法来做到这一点。

var TrackableRest = declare([Rest, SimpleQuery, Trackable]);
var store = new TrackableRest(target: '/api/users', useRangeHeaders: true, idProperty: 'username');
aspect.after(store, "fetch", function (deferred) 
    return deferred.then(function (response) 
        response.remove = false;
        return json(response);
    )
);
var grid = new (declare([OnDemandGrid, Selection, Editor]))(
    collection: store,
    className: "dgrid-autoheight",
    columns: 
        username: 
            label: core.username
        ,
        email: 
            label: core.email
        ,
        enabled: 
            label: core.enabled,
            editor: CheckBox,
            editOn: "click",
            sortable: false,
            renderCell: libGrid.renderGridCheckbox
        ,
        locked: 
            label: core.locked,
            editor: CheckBox,
            editOn: "click",
            sortable: false,
            renderCell: libGrid.renderGridCheckbox
        ,
        remove: 
            editor: CheckBox,
            editorArgs: "checked": false,
            editOn: "click",
            label: core.remove,
            sortable: false,
            className: "remove-cb",
            renderHeaderCell: function (node) 
                var inp = domConstruct.create("input", id: "cb-all", type: "checkbox");
                return inp;
            ,
            renderCell: libGrid.renderGridCheckbox
        
    ,
    selectionMode: "none"
, 'grid');

另外,我不想将删除列发送到服务器。

【问题讨论】:

【参考方案1】:

我的最终实现是像这样对删除列进行编码:

            remove: 
                editor: CheckBox,
                label: core.remove,
                sortable: false,
                className: "remove-cb",
                renderHeaderCell: function (node) 
                    var inp = domConstruct.create("input", id: "cb-all", type: "checkbox");
                    return inp;
                
            

执行删除的代码如下:

    var removeBtn = new Button(
        label: core.remove
    , 'user-remove-btn');
    removeBtn.startup();
    removeBtn.on("click", function (event) 
        var markedForDeletion = query(".dgrid-row .remove-cb input:checked", "user-grid");
        if( markedForDeletion.length > 0 ) 
            lib.confirmAction(core.areyousure, function () 
                markedForDeletion.forEach(function (node) 
                    var row = grid.row(node);
                    store.remove(row.data.username);
                );
            );
        
    );

因此,删除列成为由网格和事件处理程序处理的仅限客户端的控件。

【讨论】:

以上是关于将列添加到 dstore 支持的 dgrid的主要内容,如果未能解决你的问题,请参考以下文章

Dojo dGrid/dStore 实时更新

Dgrid 0.4 和 dstore:在 UI 中更新行而不需要放置请求

Dojo dgrid dstore 集合 - “或”过滤器不起作用

使用 dstore Rest 在查询参数中禁用过滤器

如何使用 contains 方法过滤 dstore?

我找不到将数据库源添加到 dgrid 的优雅方法