按钮的重要性

按钮占据表格50%以上的功能,表头按钮和行按钮的渲染比较复杂。
从源码上来分析这些表格渲染和点击事件的行为。后续要修改或添加按钮就很容易了。
表头按钮

为什么会显示这些按钮?
如何去掉其中部分按钮?
如何添加新的表头按钮?
输入图片说明
为什么会显示这些表头按钮

是在html里的toolbar里定义了的,这个有定义就会出现,还是比较直接的,说明并不是根据什么配置数据来动态渲染的。
如果要添加新按钮或去掉一些按钮,直接修改这里的html就可以。
输入图片说明
按钮的事件

以上的html只定义了按钮的名称、位置,但是看不不出他们的动作事件。
各个按钮的动作事件在require-table.js的Table.api.bindevent来设定的。
各个按钮的className是约定好的,不能去修改,除非同步修改了Table.config里的默认配置。否则就找不到这些按钮来动态设置动作。
输入图片说明
行按钮

为什么会默认显示这些按钮?
如何去掉其中部分按钮?
如何添加新的行按钮?
输入图片说明
默认的行按钮 Table.api.formatter.operate

从如下的js可以看到操作列是使用了Table.api.formatter.operate来格式化。

var Controller = {

    index: function () {
        // 初始化表格
        table.bootstrapTable({
            columns: [
            ...
            {field: 'operate', title: __('Operate'), table: table, 
                        
                events: Table.api.events.operate,                            
                formatter: Table.api.formatter.operate
            }
        })
        ...
    
    }

}

Table.api.formatter.operate这个函数实现了默认的三个按钮的渲染。
从这个函数分析下去可以看到,如果对应的url路径不为空才显示这个行按钮,否则就不显示

operate: function (value, row, index) {

var table = this.table;
// 操作配置
var options = table ? table.bootstrapTable('getOptions') : {};
// 默认按钮组


var buttons = $.extend([], this.buttons || []);
// 所有按钮名称
var names = [];
buttons.forEach(function (item) {
    names.push(item.name);
});
if (options.extend.dragsort_url !== '' && names.indexOf('dragsort') === -1) {
    buttons.push(Table.button.dragsort);
}
if (options.extend.edit_url !== '' && names.indexOf('edit') === -1) {
    Table.button.edit.url = options.extend.edit_url;
    buttons.push(Table.button.edit);
}
if (options.extend.del_url !== '' && names.indexOf('del') === -1) {
    buttons.push(Table.button.del);
}
return Table.api.buttonlink(this, buttons, value, row, index, 'operate');

}

从这里可以看到,如果你想要屏蔽行按钮中的删除按钮,只需要删除edit_url: 'studycase/c1001project/edit',

var Controller = {

index: function () {
    // 初始化表格参数配置
    Table.api.init({
        extend: {
            index_url: 'studycase/c1001project/index' + location.search,
            add_url: 'studycase/c1001project/add',
            edit_url: 'studycase/c1001project/edit',
            del_url: 'studycase/c1001project/del',
            multi_url: 'studycase/c1001project/multi',
            import_url: 'studycase/c1001project/import',
            table: 'c1001_project',
        }
    });

}

如果想要删除拖拽按钮,发现上面的代码里没有拖拽的url。那就要去删除require-table.js里定义的dragsort_url: 'ajax/weigh'
总不能到删除核心文件里的东西,会影响到其他的页面的。可以在上面的 Table.api.init函数前执行,表示动态去删除这个dragsort_url。

delete Table.defaults.extend.dragsort_url;

以上通过删除url的定义的方式来影响默认行按钮的渲染行为,是一种方式。下面说另外一种,自定义行按钮。
自定义行按钮 Table.api.formatter.bottons

我们知道默认的行按钮是通过Table.api.formatter.operate这个格式化函数来实现的,那自定义的话就可以自定义一个格式化函数。
require-table.js其实也为我们准备了比较便捷的自定义的方式:Table.api.formatter.bottons函数

var Controller = {

    index: function () {
        // 初始化表格
        table.bootstrapTable({
            columns: [
            ...
            {field: 'operate', title: __('Operate'), table: table, 
                        
                events: Table.api.events.operate,                            
                buttons: [
                    {
                        name: 'dragsort',
                        icon: 'fa fa-arrows',
                        title: __('Drag to sort'),
                        extend: 'data-toggle="tooltip"',
                        classname: 'btn btn-xs btn-primary btn-dragsort'
                    },
                    
                     {
                        name: 'del',
                        icon: 'fa fa-trash',
                        title: __('Del'),
                        extend: 'data-toggle="tooltip"',
                        classname: 'btn btn-xs btn-danger btn-delone'
                    },
                   
                ],
                formatter: Table.api.formatter.buttons
        })
        ...
    
    }

}

注意使用:
1、要定义 buttons
默认的三个按钮,就拷贝这些,可以删减,调整顺序:

buttons:[

 {
    name: 'edit',
    icon: 'fa fa-pencil',
    title: __('Edit'),
    extend: 'data-toggle="tooltip"',
    classname: 'btn btn-xs btn-success btn-editone'
},
 {
    name: 'del',
    icon: 'fa fa-trash',
    title: __('Del'),
    extend: 'data-toggle="tooltip"',
    classname: 'btn btn-xs btn-danger btn-delone'
},
 {
    name: 'dragsort',
    icon: 'fa fa-arrows',
    title: __('Drag to sort'),
    extend: 'data-toggle="tooltip"',
    classname: 'btn btn-xs btn-primary btn-dragsort'
}

]

2、要使用formatter: Table.api.formatter.buttons 而不能再使用 formatter: Table.api.formatter.operate
行按钮的url渲染 Table.api.buttonlink

修改按钮的url是如何增加上去?
Table.api.buttonlink这个函数负责渲染行按钮的url,formatter: Table.api.formatter.buttons 和 formatter: Table.api.formatter.operate 最终都会调用这个函数来渲染按钮。
这个函数,检查到每个button定义里,如果有url,就渲染一个url;如果没有,这href就给个javascript:
输入图片说明
行按钮的行为设置

1、点击修改按钮会弹窗,在哪里定义了弹窗呢,是在 Table.api.events.operate
输入图片说明
2、点击删除按钮会提示二次确认,在哪里定义了二次确认呢,也是在 Table.api.events.operate
输入图片说明
3、拖拽按钮可以支持拖拽,在哪里增加的事件呢,
输入图片说明

特别注意:自定义的行按钮(非默认三个),他们的className就不要和默认的一样。
自定义行按钮自定义url

我们从上面的自定义按钮的bottons属性可以看到,也没有体现url属性。修改、删除、拖拽这三个默认的url是从约定好的:

// 初始化表格参数配置
Table.api.init({
    extend: {
        index_url: 'studycase/c1001project/index' + location.search,
        add_url: 'studycase/c1001project/add',
        edit_url: 'studycase/c1001project/edit?name={name}',
        del_url: 'studycase/c1001project/del',
        multi_url: 'studycase/c1001project/multi',
        import_url: 'studycase/c1001project/import',
        table: 'c1001_project',
    }
});

拖拽的url是在require-table.js里约定了的,如果业务侧js没重新定义,就取require-table.js里的。

那自定义的行按钮的url就要显式的体现:

buttons:[

 {
    name: 'edit',
    icon: 'fa fa-pencil',
    title: __('Edit'),
    extend: 'data-toggle="tooltip"',
    classname: 'btn btn-xs btn-success btn-editone'
},
{
    name: 'AddSub',
    text: __('Edit'),
    classname: 'btn btn-xs btn-success btn-addsub btn-dialog',
    icon: 'fa fa-plus',
    url: $.fn.bootstrapTable.defaults.extend.addsub_url,
    extend: 'data-area=\'["98%","98%"]\'', //这是控制弹窗的弹出的尺寸
    refresh: true
},
 {
    name: 'del',
    icon: 'fa fa-trash',
    title: __('Del'),
    extend: 'data-toggle="tooltip"',
    classname: 'btn btn-xs btn-danger btn-delone'
},
 {
    name: 'dragsort',
    icon: 'fa fa-arrows',
    title: __('Drag to sort'),
    extend: 'data-toggle="tooltip"',
    classname: 'btn btn-xs btn-primary btn-dragsort'
}

]

里面的AddSub就是自定义的按钮,自定义的url。
如果要为这个行自定义按钮增加点击事件,在页面js里增加:

Table.api.events.operate = $.extend(Table.api.events.operate, {

'click .btn-diy': function (e, value, row, index){
    console.log(row);
}               

})

总结

1、删减行按钮:屏蔽url
2、增加行按钮:显式配置buttons属性,并使用formatter: Table.api.formatter.buttons
3、按钮url:行按钮buttons属性有url属性则显示超链接,无url显示javascrip:
4、按钮classname要注意:和默认的区别开来
5、按钮增加JS事件:扩展Table.api.events.operate

标签: none

添加新评论