fastadmin:在新增页面,打开弹窗单选,参数回传

news2024/11/17 7:44:17

样式:

核心代码:

一、弹窗的控制器中:

 //  定义一个公共函数select(),如果这个请求是Ajax,则返回index()函数,否则返回view对象的fetch()函数。
public function select()
{
    if ($this->request->isAjax()) {
        return $this->index();
    }
    return $this->view->fetch();
}

二、弹窗的页面样式,新增的页面select.html(位置同add.html一致)

<div class="panel panel-default panel-intro">
    <div class="panel-body no-padding">
        <div id="myTabContent" class="tab-content">
            <div class="tab-pane fade active in" id="one">
                <div class="widget-body no-padding">
                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap">
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>

三、弹窗对应js

写入select的方法

select: function () {
    // 初始化表格参数配置
    Table.api.init({
        extend: {
            index_url: 'popup/purchase/itemno/select',//页面路径
        }
    });
    var table = $("#table");
    // 初始化表格
    table.bootstrapTable({
        url: $.fn.bootstrapTable.defaults.extend.index_url,
        sortName: 'id',
        showToggle: false,
        showExport: false,
        maintainSelected: true,
        searchFormVisible: true, //是否始终显示搜索表单
        // commonSearch: false,//快速搜索
        singleSelect: true,//多选变为单选
        visible: false,//浏览模式(卡片切换)、显示隐藏列、导出、通用搜索全部隐藏
        showColumns: false,//列,可隐藏不显示的字段
        search:false,//快速搜索,搜索框
        columns: [
            [
                // {checkbox: true},//隐藏复选框
                {field: 'item_no', title: __('Item_no'), operate: 'LIKE'},
                {field: 'item_name', title: __('Item_name'), operate: 'LIKE'},
                {field: 'item_desc', title: __('Item_desc'), operate: 'LIKE'},
                {field: 'units', title: __('Units'), operate: 'LIKE'},
                //选择按钮
                {
                    field: 'operate', title: __('Operate'), events: {
                        'click .btn-chooseone': function (e, value, row, index) {
                            // 回传数据给Fast.api.open的callback,很重要
                            Fast.api.close({row:row}); 
                        },
                    }, formatter: function () {//点击按钮跳转到对应的页面
                        return '<a href="javascript:;" class="btn btn-danger btn-chooseone btn-xs"><i class="fa fa-check"></i> ' + __('Choose') + '</a>';
                    },
                }
            ]
        ]
    });
    // 为表格绑定事件
    Table.api.bindevent(table);
    },

四、新增页面的前端展示

样式:

给'料号'增加点击出现弹窗的功能,

增加回传值要用到的id,①id="item_no<%=index+1%>";②id="item_name<%=index+1%>";③id="item_desc<%=index+1%>";④id="units<%=index+1%>"

增加需要打开弹窗的地址:data-url="popup/purchase/itemno/select"

class中写入:fachoosetable

增加参数行信息,传给弹窗,以便回传参数数,知道对应的具体行:data-line="<%=index+1%>"

// 料号
<td>
    <input type="text" id="item_no<%=index+1%>" data-url="popup/purchase/itemno/select" class="form-control fachoosetable"  data-line="<%=index+1%>" name="<%=name%>[<%=index%>][item_no]"/>
</td>
// 料号名称
<td>
    <input type="text" class="form-control" id="item_name<%=index+1%>" name=""  />
</td>
// 规格型号
<td>
    <input type="text" class="form-control" id="item_desc<%=index+1%>" name=""  />
</td>
// 单位
<td>
  <input type="text" class="form-control" id="units<%=index+1%>" name="" />
</td>

五、新增页面对应的js

 //选择页面弹窗
//选择所有具有"form"角色的表单。
var form = $("form[role=form]");
//fachoosetable(form)是一个函数,它可以用来检查一个表单中的输入字段,以确保它们符合预定义的模式或规则。
fachoosetable(form);
//定义函数fachoosetable()
function fachoosetable (form) {
    // 如果表单中的".fachoosetable"元素的大小大于0,则执行下面的代码。
    if ($(".fachoosetable", form).size() > 0) {
        //对class为fachoosetable的组件执行点击事件
        $(".fachoosetable", form).on('click', function () {
            var that = this;
            //获取该界面的前端页面传来的line(前端展示的是data-line)
            var line = $(this).data("line") ? $(this).data("line") : false;
            //获取该界面的前端界面传来的url
            var url = $(this).data("url") ? $(this).data("url") : (typeof Backend !== 
            'undefined' ? "popup/purchase/itemno/select" : "");
            //打开弹窗
            parent.Fast.api.open(url + "?line=" + line, __('Choose'), {
                 //回传值
                callback: function (data) {
                    //直接给页面的该行数据定义值
                       $("#item_no"+line).val(data.row.item_no);
                       $("#item_name"+line).val(data.row.item_name);
                       $("#item_desc"+line).val(data.row.item_desc);
                       $("#units"+line).val(data.row.units);
                }
            });
            return false;
        });
    }
}

全部代码:

选择页面:

select.html

<div class="panel panel-default panel-intro">
    <div class="panel-body no-padding">
        <div id="myTabContent" class="tab-content">
            <div class="tab-pane fade active in" id="one">
                <div class="widget-body no-padding">
                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap">
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>

js

define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
    var Controller = {
        select: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                    index_url: 'popup/purchase/itemno/select',
                }
            });
            var table = $("#table");
            // 初始化表格
            table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                sortName: 'id',
                showToggle: false,
                showExport: false,
                maintainSelected: true,
                searchFormVisible: true, //是否始终显示搜索表单
                // commonSearch: false,//快速搜索
                singleSelect: true,//多选变为单选
                visible: false,//浏览模式(卡片切换)、显示隐藏列、导出、通用搜索全部隐藏
                showColumns: false,//列,可隐藏不显示的字段
                search:false,//快速搜索,搜索框
                columns: [
                    [
                        // {checkbox: true, cellStyle: {css: {"min-width": "200px"}}},
                        {field: 'item_no', title: __('Item_no'), operate: 'LIKE'},
                        {field: 'item_name', title: __('Item_name'), operate: 'LIKE'},
                        {field: 'item_desc', title: __('Item_desc'), operate: 'LIKE'},
                        {field: 'units', title: __('Units'), operate: 'LIKE'},
                        {
                            field: 'operate', title: __('Operate'), events: {
                                'click .btn-chooseone': function (e, value, row, index) {
                                    // 回传数据给Fast.api.open的callback
                                    Fast.api.close({row:row}); 
                                },
                            }, formatter: function () {
                                return '<a href="javascript:;" class="btn btn-danger btn-chooseone btn-xs"><i class="fa fa-check"></i> ' + __('Choose') + '</a>';
                            },
                        }
                    ]
                ]
            });
            // 为表格绑定事件
            Table.api.bindevent(table);
        },

        index: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                    index_url: 'popup/purchase/itemno/index' + location.search,
                    add_url: 'popup/purchase/itemno/add',
                    edit_url: 'popup/purchase/itemno/edit',
                    del_url: 'popup/purchase/itemno/del',
                    multi_url: 'popup/purchase/itemno/multi',
                    import_url: 'popup/purchase/itemno/import',
                    table: 'bom_item',
                }
            });
            
            Form.api.bindevent($("form[role=form]"), function(data, ret){
                //这里是表单提交处理成功后的回调函数,接收来自php的返回数据
                Fast.api.close(data);//这里是重点
                Toastr.success("成功");//这个可有可无
            }, function(data, ret){
                Toastr.success("失败");
            });
            var table = $("#table");

            // 初始化表格
            table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                pk: 'id',
                sortName: 'id',
                fixedColumns: true,
                fixedRightNumber: 1,
                searchFormVisible: true, //是否始终显示搜索表单
                // commonSearch: false,//快速搜索
                singleSelect: true,//多选变为单选
                visible: false,//浏览模式(卡片切换)、显示隐藏列、导出、通用搜索全部隐藏
                showToggle: false,//浏览模式可以切换卡片视图和表格视图两种模式
                showColumns: false,//列,可隐藏不显示的字段
                search:false,//快速搜索,搜索框
                showExport: false,//导出
                columns: [
                    [
                        {checkbox: true},
                        {field: 'item_no', title: __('Item_no'), operate: 'LIKE'},
                        {field: 'item_name', title: __('Item_name'), operate: 'LIKE'},
                        {field: 'item_desc', title: __('Item_desc'), operate: 'LIKE'},
                        {field: 'units', title: __('Units'), operate: 'LIKE'},
                        // {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                    ]
                ]
            });

            // 为表格绑定事件
            Table.api.bindevent(table);
        },
        recyclebin: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                    'dragsort_url': ''
                }
            });

            var table = $("#table");

            // 初始化表格
            table.bootstrapTable({
                url: 'popup/purchase/itemno/recyclebin' + location.search,
                pk: 'id',
                sortName: 'id',
                columns: [
                    [
                        {checkbox: true},
                        {field: 'id', title: __('Id')},
                        {
                            field: 'deletetime',
                            title: __('Deletetime'),
                            operate: 'RANGE',
                            addclass: 'datetimerange',
                            formatter: Table.api.formatter.datetime
                        },
                        {
                            field: 'operate',
                            width: '140px',
                            title: __('Operate'),
                            table: table,
                            events: Table.api.events.operate,
                            buttons: [
                                {
                                    name: 'Restore',
                                    text: __('Restore'),
                                    classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
                                    icon: 'fa fa-rotate-left',
                                    url: 'popup/purchase/itemno/restore',
                                    refresh: true
                                },
                                {
                                    name: 'Destroy',
                                    text: __('Destroy'),
                                    classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
                                    icon: 'fa fa-times',
                                    url: 'popup/purchase/itemno/destroy',
                                    refresh: true
                                }
                            ],
                            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;
});

控制器

<?php

namespace app\admin\controller\popup\purchase;

use app\common\controller\Backend;

/**
 * bom料号维护管理
 *
 * @icon fa fa-circle-o
 */
class Itemno extends Backend
{

    /**
     * Itemno模型对象
     * @var \app\admin\model\popup\purchase\Itemno
     */
    protected $model = null;

    public function _initialize()
    {
        parent::_initialize();
        $this->model = new \app\admin\model\popup\purchase\Itemno;
        $this->view->assign("statusList", $this->model->getStatusList());
        $this->view->assign("soFlagList", $this->model->getSoFlagList());
    }



    /**
     * 选择表格
     */
    public function select()
    {
        if ($this->request->isAjax()) {
            return $this->index();
        }
        return $this->view->fetch();
    }
    /**
     * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
     * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
     * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
     */


    /**
     * 查看
     */
    public function index()
    {
        //当前是否为关联查询
        $this->relationSearch = false;
        //设置过滤方法
        $this->request->filter(['strip_tags', 'trim']);
        if ($this->request->isAjax()) {
            //如果发送的来源是Selectpage,则转发到Selectpage
            if ($this->request->request('keyField')) {
                return $this->selectpage();
            }
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();

            $list = $this->model
                    
                    ->where($where)
                    ->order($sort, $order)
                    ->paginate($limit);

            foreach ($list as $row) {
                $row->visible(['id','item_no','item_name','item_desc','units']);
                
            }
            $result = array("total" => $list->total(), "rows" => $list->items());
            return json($result);
        }
        return $this->view->fetch();
    }

}

新增页面

add.html

<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
    <div style="border-radius:2px;margin-bottom:10px;background:#f5f5f5;padding:2% 5%;">
        <div class="row" style="">
            <!--部门-->
            <label class="control-label col-xs-12 col-sm-1"><span style="color:red;">*</span>{:__('Depart_name')}:</label>
            <div class="form-group col-xs-12 col-sm-2">
                <!--数据排序-->
                <input id="c-depart_name" data-source="setting/basicinformation/departs" data-field="depart_code" data-pagination="true" data-page-size="5" data-order-by="id" data-primary-key="depart_code" class="form-control selectpage" name="row[depart_name]" type="text" placeholder="--请选择部门--">
            </div>
            <!--需求日期-->
            <label class="control-label col-xs-12 col-sm-1"><span style="color:red;">*</span>{:__('Need_time')}:</label>
            <div class="form-group col-xs-12 col-sm-2">
                <input id="c-need_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[need_time]" type="text" value="{:date('Y-m-d H:i:s')}">
            </div>
            <!--订单类型-->
            <label class="control-label col-xs-12 col-sm-1"><span style="color:red;">*</span>{:__('Order_type')}:</label>
            <div class="form-group col-xs-12 col-sm-2">
                <select  id="c-order_type" data-rule="required" class="form-control selectpicker" name="row[order_type]">
                {foreach name="orderTypeList" item="vo"}
                    <option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option>
                {/foreach}
            </select>
            </div>
        </div>
        <!--备注-->
        <div class="row" style="">
            <label class="control-label col-xs-12 col-sm-1">{:__('Remark')}:</label>
            <div class="form-group col-xs-12 col-sm-5">
                <input id="c-remark" class="form-control" name="row[remark]" type="text">
            </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-primary btn-embossed disabled">{:__('OK')}</button>
            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
        </div>
    </div>
    <!--行-->
    <div class="form-group row">
        <div>
            <!--data-template的值作为行中的id值,才能便于追加行与引用-->
            <table class="table fieldlist" data-template="linedetail" data-name="linedetail" id="linetable" >
                <thead>
                  <tr class="info">
                      <th>行号</th>
                      <th>工单号</th>
                      <th>料号<span style="color:red;">*</span></th>
                      <th>料号名称</th>
                      <th>规格型号</th>
                      <th>单位</th>
                      <th>数量<span style="color:red;">*</span></th>
                      <th>长</th>
                      <th>宽</th>
                      <th>高</th>
                      <th>重量</th>
                      <th>备注</th>
                      <th>操作</th>
                  </tr>
                </thead>
                <tbody>
                    <!--name中<%=name%>表示的是data-template为此地的id值linedetail,对应的data-name的值linedetail-->
                    <script id="linedetail" type="text/html">
                        <tr class="active">
                            // <%=name%>[<%=index%>][line]表示该编程语言中调用由名称为“name”的变量中的索引为“index”的元素的对应的行号。
                            //var obj = {'line':'','stockid':'','item_name':'','uom':'','ship_flag':'','need_time':'','quantity':'','price':'','line_amount':'','line_remark':''};
                            // 行号
                            <td style="width:75px">
                                <input type="text" readonly="readonly" class="form-control" name="<%=name%>[<%=index%>][line]" value="1"/>
                            </td>
                            // 工单号
                            <td class="form-group">
                                <input data-rule="required" type="text" class="form-control"  name="<%=name%>[<%=index%>][wip_entity_name]"/>
                            </td>
                            // 料号
                             <td>
                                <input type="text" id="item_no<%=index+1%>" data-url="popup/purchase/itemno/select" class="form-control fachoosetable"  data-line="<%=index+1%>" name="<%=name%>[<%=index%>][item_no]"/>
                             </td>
                            // 料号名称
                            <td>
                                <input type="text" class="form-control" id="item_name<%=index+1%>" name=""  />
                            </td>
                            // 规格型号
                            <td>
                                <input type="text" class="form-control" id="item_desc<%=index+1%>" name=""  />
                            </td>
                            // 单位
                            <td>
                              <input type="text" class="form-control" id="units<%=index+1%>" name="" />
                            </td>
                            // 数量
                            <td style="width:100px" class="form-group">
                                <input data-rule="required" id="quantity<%=index+1%>" type="text" class="form-control all_quantity"  name="<%=name%>[<%=index%>][quantity]"/>
                            </td>
                            // 长
                            <td>
                                <input type="text" class="form-control"  name="<%=name%>[<%=index%>][chang]"  />
                            </td>
                            // 宽
                            <td>
                                <input type="text" class="form-control"  name="<%=name%>[<%=index%>][kuan]"  />
                            </td>
                            // 高
                            <td>
                                <input type="text" class="form-control"  name="<%=name%>[<%=index%>][gao]"  />
                            </td>
                            // 重量
                            <td>
                                <input type="text" class="form-control"  name="<%=name%>[<%=index%>][weight]"  />
                            </td>
                            // 备注        
                            <td>
                                <input type="text" class="form-control"  name="<%=name%>[<%=index%>][remark]"/>
                            </td>
                            
                            //请购单号
                            <td style="display:none">
                                <input type="hidden" class="form-control"  name="<%=name%>[<%=index%>][pr_num]"/>
                            </td>
                            <td>
                                <span class="btn btn-sm btn-danger btn-removeline"><i class="fa fa-times"></i></span>
                            </td>
                        </tr>
                    </script>
                    
                    
                </tbody>
                <tr>
                    <td colspan="1"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plas"></i>添加行</a></td>
                    <td colspan="6">{:__('总计数量')}:<input id="all_quantity" type="text" name="all_quantity" readonly="readonly" style="width:80px;border-width:0px"/></td>
                </tr>
            </table>
            <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
            <textarea id="textarea1" name="linedetail" class="form-control hidden" cols="30" rows="5"></textarea>
        </div>
    </div>  
</form>

js

define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {

    var Controller = {
        index: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                    index_url: 'purchase/purchasefunction/purchaserequisition/index' + location.search,
                    add_url: 'purchase/purchasefunction/purchaserequisition/add',
                    edit_url: 'purchase/purchasefunction/purchaserequisition/edit',
                    del_url: 'purchase/purchasefunction/purchaserequisition/del',
                    multi_url: 'purchase/purchasefunction/purchaserequisition/multi',
                    import_url: 'purchase/purchasefunction/purchaserequisition/import',
                    table: 'purchase_pr_headers',
                }
            });
            //修改新增页面的大小
            $(".btn-add").data("area", ["80%","90%"]);//为选择器为".btn-add"的元素设置一个data属性"area",值为["90%","90%"]。
            //修改编辑页面的大小
            $(".btn-edit").data("area", ["80%","90%"]);//为选择器为".btn-edit"的元素设置一个data属性"area",值为["90%","90%"]。
            //修改表格中编辑按钮弹出页面的大小
            $(document).on('post-body.bs.table', function (e, settings, json, xhr) {
                $(".btn-editone").data("area", ["80%", "90%"]);
            });
            var table = $("#table");
            // 初始化表格
            table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                pk: 'id',
                sortName: 'id',
                fixedColumns: true,
                fixedRightNumber: 2,
                columns: [
                    [
                        {checkbox: true},
                        {field: 'pr_num', title: __('Pr_num'), operate: 'LIKE'},
                        {field: 'status', title: __('Status'), searchList: {"0":__('Status 0'),"1":__('Status 1'),"2":__('Status 2'),"3":__('Status 3')}, formatter: Table.api.formatter.status},
                        {field: 'need_time', title: __('Need_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
                        {field: 'approve_by', title: __('Approve_by'), operate: 'LIKE'},
                        {field: 'approve_time', title: __('Approve_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
                        {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
                        {field: 'depart_name', title: __('Depart_name'), operate: 'LIKE'},
                        {field: 'order_type', title: __('Order_type'), searchList: {"0":__('Order_type 0'),"1":__('Order_type 1')}, formatter: Table.api.formatter.normal},
                        //查看
                        {field: 'id', title: __('detial'), table: table, 
                            buttons: 
                                [
                                   {
                                       name: 'name1',
                                       text:__('detials'), 
                                       title: __('detials'),
                                       icon: 'fa fa-list',//图标
                                       classname: 'btn btn-xs btn-primary btn-dialog', //btn-dialog表示为弹窗
                                       url: 'popup/purchase/prline/index?pr_num={pr_num}',//自带参数ids
                                       extend: 'data-area=\'["75%","75%"]\'',//弹窗大小
                                        callback:function(data){}
                                   },
                                ], operate:false, formatter: Table.api.formatter.buttons
                        },
                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                    ]
                ]
            });

            // 为表格绑定事件
            Table.api.bindevent(table);
        },
        recyclebin: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                    'dragsort_url': ''
                }
            });

            var table = $("#table");

            // 初始化表格
            table.bootstrapTable({
                url: 'purchase/purchasefunction/purchaserequisition/recyclebin' + location.search,
                pk: 'id',
                sortName: 'id',
                columns: [
                    [
                        {checkbox: true},
                        {field: 'id', title: __('Id')},
                        {
                            field: 'deletetime',
                            title: __('Deletetime'),
                            operate: 'RANGE',
                            addclass: 'datetimerange',
                            formatter: Table.api.formatter.datetime
                        },
                        {
                            field: 'operate',
                            width: '140px',
                            title: __('Operate'),
                            table: table,
                            events: Table.api.events.operate,
                            buttons: [
                                {
                                    name: 'Restore',
                                    text: __('Restore'),
                                    classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
                                    icon: 'fa fa-rotate-left',
                                    url: 'purchase/purchasefunction/purchaserequisition/restore',
                                    refresh: true
                                },
                                {
                                    name: 'Destroy',
                                    text: __('Destroy'),
                                    classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
                                    icon: 'fa fa-times',
                                    url: 'purchase/purchasefunction/purchaserequisition/destroy',
                                    refresh: true
                                }
                            ],
                            formatter: Table.api.formatter.operate
                        }
                    ]
                ]
            });

            // 为表格绑定事件
            Table.api.bindevent(table);
        },
        // add: function () {
        //     Controller.api.bindevent();
        // },
        add: function () {
            // 日期检查,光标移开执行
            $(document).on("blur",".datetimepicker",function(){
                //console.info("日期检查");
                // 获取当前日期,时间戳
                var date = new Date();
                // 添加分隔符“-”
                var seperator = "-";
                //获取input内需求日期
                var need_date = new Date($('#c-need_time').val());
                // 获取今天的年月日
                var year = date.getFullYear();
                var month = date.getMonth() + 1;//返回的是月份序号0-11需要+1才是月份
                var today = date.getDate();
                // 对月份进行处理,1-9月在前面添加一个“0”
                if (month >= 1 && month <= 9) {
                  month = "0" + month;
                }
                // 对日期进行处理,1-9号在前面添加一个“0”
                if (today >= 0 && today <= 9) {
                  today = "0" + today;
                }
                // 最后拼接字符串,得到一个格式为(yyyy-MM-dd)的日期
                var nowDate = date.getFullYear() + seperator + month + seperator + today;
                //转换为时间戳
                var now_date = new Date(nowDate);
                // 检查日期是否小于今天,是则弹窗提示
                if(need_date<now_date){
                    layer.alert("需求日期不可以小于今天!");
                    $('#c-need_time').val(nowDate);//需求日期回到今天的日期
                }
            });
            //光标移开class为all_quantity对应的文本框,计算总数量
            $(document).on("blur",".all_quantity",function(){
                var all_quantity = 0;//设置变量all_quantity为0
                var shuliang = 0;
                for(var i = 1;i<50;i++){
                    //获取单行的数量
                    shuliang  = $('#quantity' + i).val();
                    if(shuliang == ""){
                        shuliang = 0;
                    }
                    else if(Number(shuliang) >0){
                        //大于零的话,总数量就等于初始的总数量加上当前行的数量
                        all_quantity = Number(all_quantity) + Number(shuliang);
                    }
                }
                //总数量的值就是经过循环计算出来的值
                $('#all_quantity').val(all_quantity);
            });
            
            // 是指在前端模板中通过参数 "Fast" 引用后端代码中的 Fast 函数,用于前后端的交互
            Template.helper("Fast", Fast);
            //用于追加行的实现,追加行之后,行值发生改变
            //fa.event.appendfieldlist事件是指,当用户在确认框的输入框中添加新字段时触发的事件
            //当在文档上发生fa.event.appendfieldlist事件时,为id为linetable的元素中class为btn-append的元素绑定一个函数,该函数接受e和obj两个参数。
            $(document).on("fa.event.appendfieldlist", "#linetable .btn-append", function (e, obj) {
                //绑定动态下拉组件,触发下拉列表功能,解决不会被渲染的问题
                Form.events.selectpage(obj);
                //绑定日期组件,触发日期选择功能
                Form.events.datetimepicker(obj);
                //判断id下linetable的长度
                var len = $('#linetable tr').length;
                //console.info(len);
                for (var i = 1; i < len - 1; i++) {
                    $('#linetable tr:eq(' + i + ') td:first').find('input').val(i);
                    //查找id为table的表格内索引为i的行中的第一个单元格,然后将索引i设置为文本内容。
                    //tr:eq(' + i + ') 是一个用于选择HTML元素的jQuery选择器,意思是选取序号为i的表格行(table row)。
                }
                
                
                //选择页面弹窗
                //选择所有具有"form"角色的表单。
                var form = $("form[role=form]");
                //fachoosetable(form)是一个函数,它可以用来检查一个表单中的输入字段,以确保它们符合预定义的模式或规则。
                fachoosetable(form);
                //定义函数fachoosetable()
                function fachoosetable (form) {
                    // 如果表单中的".fachoosetable"元素的大小大于0,则执行下面的代码。
                    if ($(".fachoosetable", form).size() > 0) {
                        //对class为fachoosetable的组件执行点击事件
                        $(".fachoosetable", form).on('click', function () {
                            var that = this;
                            //获取该界面的前端页面传来的line(前端展示的是data-line)
                            var line = $(this).data("line") ? $(this).data("line") : false;
                            //获取该界面的前端界面传来的url
                            var url = $(this).data("url") ? $(this).data("url") : (typeof Backend !== 
                            'undefined' ? "popup/purchase/itemno/select" : "");
                            //打开弹窗
                            parent.Fast.api.open(url + "?line=" + line, __('Choose'), {
                                 //回传值
                                callback: function (data) {
                                    //直接给页面的该行数据定义值
                                       $("#item_no"+line).val(data.row.item_no);
                                       $("#item_name"+line).val(data.row.item_name);
                                       $("#item_desc"+line).val(data.row.item_desc);
                                       $("#units"+line).val(data.row.units);
                                }
                            });
                            return false;
                        });
                    }
                }
                
            });
            
            
            
            //自定义删除事件
            //目前仅添加了动态更新行号,判断是否为最后一条数据并抛出异常,删除实际在上述click事件中进行,由于处在源文件中且点击按钮后两个方法均会运行目前未修改完成
            $(document).on("click", ".btn-removeline", function () {
                if ($('#linetable tr').length == 3) {
                    // alert(__("Can't delete"));
                    // return false;
                    Toastr.info("这是最后一条了!"); 
                    throw new Error('Generated error manually to stop execution of script');
                }
                // 先找到最近的具有“fieldlist”类的元素,这里则是html中的table,将其赋值给变量container;
                var container = $(this).closest(".fieldlist");
                //定义一个tagName,先去寻找container中是否有data-tag(同data-name,data-template),如果没有就判断container是否是一个table,如果是tagName的值为tr,否则为dd
                var tagName = container.data("tag") || (container.is("table") ? "tr" : "dd");
                //找到最近的具有tagName标签(这里即tr)
                $(this).closest(tagName).remove();
                //refresh(container);
                Toastr.info("删除成功!"); 
                //设置行号的值
                var len = $('#linetable tr').length;
                //console.info(len);
                for (var i = 1; i < len - 1; i++) {
                    $('#linetable tr:eq(' + i + ') td:first').find('input').val(i);
                    //查找id为table的表格内索引为i的行中的第一个单元格,然后将索引i设置为文本内容。
                    //tr:eq(' + i + ') 是一个用于选择HTML元素的jQuery选择器,意思是选取序号为i的表格行(table row)。
                }
                //执行删除的时候总数进行变更
                var all_quantity = 0;//设置变量all_quantity为0
                var shuliang = 0;
                for(var j = 1;j<50;j++){
                    //获取单行的数量
                    shuliang  = $('#quantity' + j).val();
                    if(shuliang == ""){
                        shuliang = 0;
                    }
                    else if(Number(shuliang) >0){
                        //大于零的话,总数量就等于初始的总数量加上当前行的数量
                        all_quantity = Number(all_quantity) + Number(shuliang);
                    }
                }
                //总数量的值就是经过循环计算出来的值
                $('#all_quantity').val(all_quantity);
            });
            //因为日期选择框不会触发change事件,导致无法刷新textarea,所以加上判断
            $(document).on("dp.change", "#add-form .datetimepicker", function () {
                // 触发当前元素的父元素的上一个元素的input的change事件。
                $(this).parent().prev().find("input").trigger("change");
            });
            var len = $('#linetable tr').length - 1;//寻找id为table的表格tr的长度(即寻找在表格table下的tr的个数)-1(除去表头)
            var lens = len - 2;//减二的目的是减去第一行固定行和最后一行总计行(保留两行)
            
            //选择行料号,自动带出料号相关信息
            // $('#linedetail #item_no').data("eSelect",function(data){
            //     alert("111")
            //     // for(var i = 1; i < 50; i++){
            //     //     //求出每行的item_no值
            //     //     var item_no = $('#item_no' + i).val();
            //     //     if(item_no == ""){
                        
            //     //     }
            //     //     else{
            //     //         $('#item_name'+ i).val(data.item_name);//将id为c-customer_contact的值更改为控制器中的customer_contacts
            //     //         $('#item_desc'+ i).val(data.item_desc);//币别
            //     //         $('#units'+ i).val(data.units);//币别 
            //     //     }
            //     // }
            // });
          
            
            
            
            Controller.api.bindevent();
            
           
            
            
            // //选择,自动带出客户相关信息
            // $('#c-customer_code').data("eSelect",function(data){//对需要改变的数据进行监听,如果选中id为c-customer_code的值,就更改下面的值
            //     $('#c-customer_contact').val(data.customer_contacts);//将id为c-customer_contact的值更改为控制器中的customer_contacts
            //     $('#c-currency_code').val(data.currency_code);//币别
            //     $('#c-ship_address').val(data.customer_address);//出货地址
            //     $('#c-yewu').val(data.employee_num);//业务员
            //     $('#c-yewu').selectPageRefresh();//刷新下拉列表以显示选项
            //     // $('#c-tax_name').val(data.tax_name);//税别
            //     // $('#c-tax_name').selectPageRefresh();//刷新下拉列表以显示选项
            //     $('#c-tax_flag').selectpicker('val', data.tax_flag);//是否含税
            //     $('#c-term_name').val(data.term_name);//付款条件
            //     $('#c-term_name').selectPageRefresh();//刷新下拉列表以显示选项
            // });
    //选择税别带出税率
            // $('#c-tax_name').data("eSelect",function(data){//对需要改变的数据进行监听,如果选中id为c-tax_name的值,就更改下面的值
            //     $('#c-tax_rate').val(data.tax_mount);//将id为c-tax_rate的值更改为控制器中的tax_mount
            // });
            
    //表单selectpage动态渲染,打开页面后仅渲染一次。通过js添加的selectpage需要手动触发渲染
            Form.events.selectpage($('#add-form'));
            
             
            
            
            
    // 实现提交表单之后不关闭弹窗
            // Form.api.bindevent($("form"), function(data,ret){
            //     //成功的回调,如果返回false,将不会出现提示消息
            //     // Toastr.success("生成成功");
            //     //return false;//这行代码阻止弹框关闭
            // }, function(data, ret){
            //     //失败的回调,如果返回false,将不会出现提示消息
            // }, function(success, error){
            //     //如果返回falsle,将阻止表单的提交
            //     //如果处理成功后我们可以使用Form.api.submit(this, success, error);再次提交表单
            // });
            
        },
        edit: function () {
            Controller.api.bindevent();
        },
        api: {
            bindevent: function () {
                Form.api.bindevent($("form[role=form]"));
            }
        }
    };
    return Controller;
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C 学习笔记 —— 函数指针

函数指针 上面的第二个char (* f) (int);写法就是函数指针的声明&#xff1b; 首先&#xff0c;什么是函数指针&#xff1f;假设有一个指向 int类型变量的指针&#xff0c;该指针储存着这个int类型变量储存在内存位置的地址。 同样&#xff0c;函数也有地址&#xff0c;因为函…

LC-3—MIO、MMIO、Caller Save、Callee Save

LC-3—MIO、MMIOMMIOMIOCaller Save、Callee Save举个例子MMIO MMIO&#xff08;Memory Mapped I/O&#xff09;是一种在系统内存中映射I/O端口的技术&#xff0c;它允许设备直接访问内存中的特定地址&#xff0c;从而实现I/O操作。MMIO技术可以提高I/O操作的效率&#xff0c;…

Mysql 事务版本链(RR 与 RC 的本质区别)

版本链其实就是CURD的历史记录&#xff0c;回滚的本质也是用版本链中的最近一条历史记录覆盖当前记录。版本链针对的是每个表中的记录&#xff0c;只要表中有任意一条记录被修改&#xff0c;版本链中就会新增一条历史记录。 目录 1、为什么需要版本链&#xff1f; 2、有关版本…

《爆肝整理》保姆级系列教程python接口自动化(二十四)--unittest断言——中(详解)

简介 上一篇通过简单的案例给小伙伴们介绍了一下unittest断言&#xff0c;这篇我们将通过结合和围绕实际的工作来进行unittest的断言。这里以获取城市天气预报的接口为例&#xff0c;设计了 2 个用例&#xff0c;一个是查询北京的天气&#xff0c;一个是查询 南京为例&#xf…

接口幂等性的通用解决方案golang版

文章目录简介幂等性如何实现前端应当处理后端基于 token redis 处理简介 接口的幂等性是指&#xff1a; 用户对同一个操作发起多次请求&#xff0c;系统的设计需要保证其多次请求后结果是一致的。常见的如支付场景&#xff0c;连续快速点击两次支付 10 元&#xff0c;不应该扣…

阶段八:服务框架高级(第三章:分布式缓存Redis)

阶段八&#xff1a;服务框架高级&#xff08;第三章&#xff1a;分布式缓存Redis&#xff09;Day-分布式缓存Redis0.学习目标1.Redis持久化1.1.RDB持久化 【重要】1.1.1.执行时机1.1.2.RDB原理1.1.3.小结1.2.AOF持久化【重要】1.2.1.AOF原理1.2.2.AOF配置1.2.3.AOF文件重写1.3.…

搜广推 WideDeep 与 DeepCrossNetwork (DCN) - 记忆+泛化共存

😄 这节来讲讲Wide&Deep与Deep&CrossNetwork (DCN)。从下图可看出WD非常重要,后面衍生出了一堆WD的变体。本节要讲的WD和DCN结构都非常简单,但其设计思想值得学习。 🚀 wide&deep:2016年,谷歌提出。 🚀 Deep&CrossNetwork (DCN):2017年,谷歌和斯坦…

刷题小抄1-2数之和

时间复杂度和空间复杂度 对于一个算法高效性的评估,分为时间复杂度与空间复杂度两种,在算法优化到极致的情况下,只能舍弃时间来换取空间,或者舍弃空间来换取时间,故而两者可以说是互斥关系 时间复杂度衡量的是算法运行的速度,而空间复杂度衡量的是算法运行所需要的额外内存空…

【Ap AutoSAR入门与实战开发03】-【Ap_s2s模块02】:到底什么是基于信号,什么是基于服务,两者的主要区别是什么?

总目录链接==>> AutoSAR入门和实战系列总目录 文章目录 1 基于信号的通信2 基于服务的通信3 面向服务设计举例在【Ap_s2s模块01】中我们大概讲述了,为什么要有s2s模块,并且简单的阐述了基于信号的通信和基于SOME/IP的服务的通信,我们接下来详细分析一下这两个概念。…

Torch单独层赋值

20230227 - 引言 对于torch中的权值初始化方式&#xff0c;以往都是采用默认的方式&#xff0c;或者利用初始化库里面的函数。但是如果想尝试一些自己的想法&#xff0c;那就必须自己来填充这部分数据&#xff0c;例如看到的内容&#xff0c;利用PCA的公式来对权值进行填充。…

CSGO社区服务器搭建架设服务器配置以及环境准备

CSGO社区服务器搭建架设服务器配置以及环境准备 CSGO作为一款射击动作游戏还原场景真实性广受大批玩家的热爱&#xff0c;很多小伙伴也有想过自己搭建的话需要知道那些东西。 我是艾西&#xff0c;今天跟大家聊聊搭建架设前我们需要知道的事情&#xff1a; Windows&#xff1…

【谷歌grc】recaptcha browser-error 错误

grc 谷歌人机验证错误 https://www.google.com/recaptcha/api/siteverif 返回错误信息 browser-error [{"success": false,"error-codes": ["browser-error"] }]之前都是调通能用的&#xff0c;突然之间就不能用了&#xff0c;查了半天也没有找…

前端实现压缩图片的功能(vue-element)

前言&#xff1a; 随着现在手机像素&#xff0c;拍照功能越来越好&#xff0c;随之而来的是本地图片越来越大&#xff0c;那么如何更好的将本地图片上传到后端接口呢&#xff1f;这是后台管理系统常见的场景和头疼的问题&#xff0c;这里分享下个人的方法。 实现效果&#xff…

java多线程(八)线程等待与线程唤醒2

三、wait(long timeout)和notify() wait(long timeout)会让当前线程处于“等待(阻塞)状态”&#xff0c;“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法&#xff0c;或者超过指定的时间量”&#xff0c;当前线程被唤醒(进入“就绪状态”)。 下面的示例就是演示…

入职数据分析公认的好书|建议收藏

众所周知&#xff0c;数据分析经常出现在我们的日常生活中&#xff0c;各行各业都需要数据分析。可你知道什么是数据分析&#xff1f;它在企业里到底扮演什么角色&#xff1f;以及如果我们自己也想拥有数据分析的能力&#xff0c;以便更好的满足数据分析的需求&#xff0c;我们…

系列六、存储引擎

一、存储引擎介绍 大家可能没有听说过存储引擎&#xff0c;但是一定听过引擎这个词&#xff0c;引擎就是发动机&#xff0c;是一个机器的核心组件。 比如&#xff0c;对于舰载机、直升机、火箭来说&#xff0c;他们都有各自的引擎&#xff0c;是他们最为核心的组件。而我们在选…

vue脚手架多页自动化生成实践

前言 在前端开发过程中&#xff0c;常常面对多种业务场景。到目前为止&#xff0c;前端对于不同场景的处理通常会采用不同的渲染方案来组合处理&#xff0c;常见的渲染方案包括&#xff1a;CSR(Client Side Rendering)、SSR(Server Side Rendering)、SSG(Static Site Generati…

2023年房地产行业研究报告

第一章 行业发展概况 房地产业是指以土地和建筑物为经营对象&#xff0c;从事房地产开发、建设、经营、管理以及维修、装饰和服务的集多种经济活动为一体的综合性产业&#xff0c;是具有先导性、基础性、带动性和风险性的产业。主要包括&#xff1a;土地开发&#xff0c;房屋的…

Vue3 -- PDF展示、添加签名(带笔锋)、导出

文章目录笔锋签名方案一实现要点实现过程组件引用页面元素添加引用实现代码效果展示缺点方案二修改页面元素替换引用修改代码效果展示完整代码地址实现功能的时候采用了两个方案&#xff0c;主要是第一个方案最后的实现效果并不太理想&#xff0c;但实现起来比较简单&#xff0…

JavaScript手写题

一、防抖 function debounce(fn, delay200) {let timeout null; // 定时器控制return function(...args) {if (timeout) { // 定时器存在&#xff0c;表示某个动作之前触发过了clearTimeout(timeout); // 清除定时器timeout null;} else {// 对第一次输入立即执行fn.apply…