了解fastadmin标准的控制器模块js的表格事件
controller/A.php<-------------->public/assets/js/backend/a.js
controller/b/A.php<-------------->public/assets/js/backend/b/a.js
标准的控制器模块js
<script src="/assets/js/require.js" data-main="/assets/js/require-backend.js?v=1551685919"></script>
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) { var Controller = { index: function () { // 初始化表格参数配置 Table.api.init({ extend: { index_url: 'category/index', add_url: 'category/add', edit_url: 'category/edit', del_url: 'category/del', multi_url: 'category/multi', dragsort_url: '', table: 'category', } }); var table = $("#table"); // 初始化表格 table.bootstrapTable({ url: $.fn.bootstrapTable.defaults.extend.index_url, escape: false, pk: 'id', sortName: 'weigh', pagination: false, commonSearch: false, columns: [ [ {checkbox: true}, {field: 'id', title: __('Id')}, {field: 'type', title: __('Type')}, {field: 'name', title: __('Name'), align: 'left'}, {field: 'nickname', title: __('Nickname')}, {field: 'flag', title: __('Flag'), operate: false, formatter: Table.api.formatter.flag}, {field: 'image', title: __('Image'), operate: false, formatter: Table.api.formatter.image}, {field: 'weigh', title: __('Weigh')}, {field: 'status', title: __('Status'), operate: false, formatter: Table.api.formatter.status}, {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate} ] ] }); // 为表格绑定事件 Table.api.bindevent(table); }, add: function () { Controller.api.bindevent(); }, edit: function () { Controller.api.bindevent(); }, api: { bindevent: function () { Form.api.bindevent($("form[role=form]")); } } }; return Controller; });
每一个控制器请求的方法对应JS模块中一个方法
js中有定义一个Controller
对象,它有index/add/edit/api
四个方法,这四个方法分别与我们控制器中的方法一一对应
如果我们在js中添加了自己的方法,如detail
方法,则对应添加Controller下的对应控制器文件下的detail
方法
在public/assets/js/backend/a.js用define()定义了a模块
加载用require(['a'], function (a){...}
我们在require配置文件/assets/js/require-backend.js中找到
//加载相应模块 if (Config.jsname) { require([Config.jsname], function (Controller) { Controller[Config.actionname] != undefined && Controller[Config.actionname](); }, function (e) { console.error(e); // 这里可捕获模块加载的错误 }); }
参数Config.jsname即为自定义的模块名(js文件),格式为:backend/a ;
Config.actionname为你在js模块定义的一个Controller
对象的属性,属性有index/add/edit/api
四个方法(对象),这四个方法分别与我们控制器中的方法一一对应
分别执行了模块js的idnex、add、edit、api这四个对象属性
Controller.index:
index 调用的是Table.api.bindevent(table); 即调用的是require-table.js里的Table对象
上面这个table有什么对象呀,事件有哪些呢
Table.list //已经渲染的表格对象 Table.defaults Bootstrap-table表格默认列的配置 Table.columnDefaults bootstraptable column的默认参数 Table.config 表格相关DOM元素类配置 如定义的button等选择器 Table.api.init(Table.defaults, Table.columnDefaults, locales) 初始化table 在这自定义修改表的前两个默认参数 Table.api.bindevent(table) //绑定事件 Table.api.multi(action, ids, table, element) // 批量操作请求 Table.api.events //单元格元素事件 Table.api.formatter //单元格数据格式化
> `Table.api.formatter.icon` 快速将字段渲染成一个按钮,仅支持Fontawesome按钮 > `Table.api.formatter.image` 快速将字段渲染成图片展示的形式 > `Table.api.formatter.images` 快速将字段渲染成多图片展示的形式,字段数据请以`,`进行分隔 > `Table.api.formatter.status` 快速将字段渲染成状态,默认`normal/hidden/deleted/locked`这四个状态 > `Table.api.formatter.url` 快速将字段渲染成URL框 > `Table.api.formatter.search` 快速将字段渲染成可搜索的链接,点击后将执行搜索 > `Table.api.formatter.addtabs` 快速将字段渲染成可添加到选项卡的链接,点击后将把链接添加到选项卡 > `Table.api.formatter.flag` 快速将字段渲染成标志,仅支持`index/hot/recommend/new`这四种标志 > `Table.api.formatter.label` 快速将字段渲染Label标签 > `Table.api.formatter.datetime` 快速时间戳数据渲染成日期时间数据 > `Table.api.formatter.operate` 操作栏固定按钮 > `Table.api.formatter.buttons` 快速生成多个按钮 > `Table.api.formatter.toggle` 快速生成切换按钮
Table.api.buttonlink(column, buttons, value, row, index, type) //生成button样式的链接 Table.api.replaceurl(url, row, table) //替换URL中的数据({变量名}) Table.api.selectedids(table) // 获取选中的条目ID集合 Table.api.toggleattr(table) // 切换复选框状态 Table.api.getrowdata(table, index) //根据行索引获取行数据 Table.api.getrowbyindex(table, index)// 根据行索引获取行数据 Table.api.getrowbyid(table, id) // 根据主键ID获取行数据
Table主要功能
load-error.bs.table 当远程数据被加载出错后触发 refresh.bs.table 当点击刷新按钮对表格进行刷新时触发 在.btn-refresh .fa的元素上添加一个fa-spin的类,转圈的图标。。。 dbl-click-row.bs.table 当双击单元格时 向.btn-edit元素传递一个click事件 post-body.bs.table 当内容渲染完成后 移除.fa-spin 向.btn-disabled类元素添加disabled属性禁止交互、不是卡片视图的的type是checkebox的td的data-index属性大于0 时拖拽选择需要重新绑定事件 check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table 选中一行。取消选中一行全选框选中全选框取消时.btn-disabled类元素disabled状态的切换 绑定panel-heading类的tab事件 .toolbar .btn-refresh下的刷新按钮事件 .toolbar .btn-add下的添加按钮事件 .toolbar .btn-import下的导入按钮事件 .toolbar .btn-edit下的编辑按钮事件 .toolbar .btn-multi批量操作按钮事件 .toolbar btn-del批量删除按钮事件 绑定拖动排序 input[data-id][name='checkbox']点击事件 [data-id].btn-change点击事件 [data-id].btn-edit点击事件 [data-id].btn-del 批量操作请求 单元格元素事件 click .btn-editone和click .btn-delone 单元格数据格式化
按钮显示:
这里的默认几个自定义的按钮或者自己在添加的直接在view模板里写注意类名要对应上;
fastadmin给默认的按钮都指定了类别如下:
Table.config.firsttd: 'tbody tr td:first-child:not(:has(div.card-views))',//不是卡片视图的的哥td(即checkebox那列)
Table.config.toolbar: '.toolbar',//包裹下面这几个自定义表格按钮的盒子
Table.config.refreshbtn: '.btn-refresh',//刷新
Table.config.addbtn: '.btn-add',//增加
Table.config.editbtn: '.btn-edit',//编辑
Table.config.delbtn: '.btn-del',//删除
Table.config.importbtn: '.btn-import',//导入
Table.config.multibtn: '.btn-multi',//批量更新
Table.config.disabledbtn: '.btn-disabled',
Table.config.editonebtn: '.btn-editone',//操作里的删除
Table.config.dragsortfield: 'weigh'
事件:
点击刷新 触发 .toolbar Table.config.refreshbtn的click事件
点击添加 触发 .toolbar Table.config.addbtn点击事件
点加导入:触发 Table.config.importbtn 点加事件
点击批量编辑按钮(螺母形状):触发 .toolbar Table.config.editbtn 点击事件
点击删除:触发 .toolbar Table.config.delbtn 点击事件
表格默认button:输出和禁用默认button
// 初始化表格参数配置 Table.api.init({ extend: { index_url: 'weixinitem/config/index', add_url: 'weixinitem/config/add', edit_url: 'weixinitem/config/edit',//默认为空则不生成 del_url: 'weixinitem/config/del',//默认为空则不生成 dragsort_ur:'',//为空则不生成 multi_url: 'weixinitem/config/multi', table: 'weixinitem_config', } }); 拖拽图标的话、在数据库不用建默认的weigh字段或者responseHandler里修改row的field字段名、或者修改require_table.js里的Table.config里的dragsortfield的值 重点说下拖拽的图标显示我们需要后台传过来的字段名(传过来前可随意组装)与table表field的值相同且与Table.config.dragsortfield的值相同且与Table.defaults.extend.dragsort_url有值
事件:
拖拽事件require(['dragsort'], function () {})
编辑:触发.btn-editone点击事件 Table.api.events.operate
删除:触发btn-delone的点击事件Table.api.events.operate
ps
fastadmin form表单组件(每个表单元素的生成)
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('文本框')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::text('row[text]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('多行文本框')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::textarea('row[textarea]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('富文本编辑器')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::editor('row[editor]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('单选')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::radios('row[radio]', ['aa'=>'AA', 'bb'=>'BB'], 'aa', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('复选')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::checkboxs('row[checkbox]', ['aa'=>'AA', 'bb'=>'BB'], 'aa', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('下拉列表')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::select('row[select]', ['aa'=>'AA', 'bb'=>'BB'], 'aa', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('下拉列表(多选)')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::selects('row[select]', ['aa'=>'AA', 'bb'=>'BB'], 'aa', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('下拉列表(友好)')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::selectpicker('row[selectpicker]', ['aa'=>'AA', 'bb'=>'BB'], 'aa', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('下拉列表(友好)(多选)')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::selectpickers('row[selectpickers]', ['aa'=>'AA', 'bb'=>'BB'], 'aa', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('动态下拉列表')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::selectpage('row[select]', 2, 'category/selectpage', null, null, ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('动态下拉列表(多选)')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::selectpages('row[select]', 2, 'category/selectpage', null, null, ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('城市选择框')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::citypicker('row[citypicker]', 2, ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('日期')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::datepicker('row[datepicker]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('时间')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::timepicker('row[timepicker]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('日期时间')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::datetimepicker('row[timepicker]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('日期区间')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::daterange('row[daterange]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('时间区间')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::timerange('row[timerange]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('日期时间区间')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::datetimerange('row[datetimerange]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('动态字段列表')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::fieldlist('row[fieldlist]', ['aa'=>'AA', 'bb'=>'BB'], null, '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('单图')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::image('row[image]', '/uploads/20180629/b83227ea668e7b2d61def9812bbce3da.png', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('多图')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::images('row[images]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('单文件')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::upload('row[upload]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('多文件')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::uploads('row[uploads]', '', ['data-rule'=>'required'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('开关')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::switcher('row[switcher1]', '0', ['color'=>'success'])} {:Form::switcher('row[switcher2]', '1', ['color'=>'yellow', 'disabled'=>true])} {:Form::switcher('row[switcher3]', 'Y', ['color'=>'navy', 'yes'=>'Y', 'no'=>'N'])} {:Form::switcher('row[switcher4]', '1', ['color'=>'info'])} {:Form::switcher('row[switcher4]', '1', ['color'=>'danger', 'disabled'])} </div> </div> <div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('联动选择')}:</label> <div class="col-xs-12 col-sm-8"> {:Form::cxselect('ajax/area', ['province','city'], ['province'=>37, 'city'=>38])} </div> </div> <div class="form-group layer-footer"> <label class="control-label col-xs-12 col-sm-2"></label> <div class="col-xs-12 col-sm-8"> <button type="submit" class="btn btn-success btn-embossed disabled">{:__('Submit')}</button> <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button> </div> </div> </form>
注意:必须还要在js中用Form.api.bindevent("form[role=form]");
进行组件初始化,否则部分组件会不生效。