Request.js 在fastadmin中如何调用的

本文介绍RequireJS在FastAdmin框架中的应用,涵盖模块化工具的配置、自定义JS及第三方库的引用方法,以及如何利用RequireJS实现按需加载。

模块化

RequestJs是模块化工具,每一个 js文件 或者库 都可以看成是一个模块,按需引入。

<script data-main="js/main" src="js/require.js"></script>

浏览器加载require.js,而requirejs会自动加载main.js

<script src="__CDN__/assets/js/require{$Think.config.app_debug?'':'.min'}.js" data-main="__CDN__/assets/js/require-backend{$Think.config.app_debug?'':'.min'}.js?v={$site.version|htmlentities}"></script>

如何使用自定义js或第三方js

引用第三方库

使用require.config({}) 配置模块,如:

require.config({
    paths: {
        'lang': "empty:",
        'form': 'require-form',
        'table': 'require-table',
        'upload': 'require-upload',
        'validator': 'require-validator',
        'drag': 'jquery.drag.min',
        'drop': 'jquery.drop.min',
        'echarts': 'echarts.min',
        'echarts-theme': 'echarts-theme',
        'jquery': '../libs/jquery/dist/jquery.min',
     
    },
    // shim依赖配置
    shim: {
        'addons': ['backend'],
        'bootstrap': ['jquery'],
        'bootstrap-table': {
            deps: [
                'bootstrap',
//                'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'
            ],
            exports: '$.fn.bootstrapTable'
        },
        'bootstrap-table-lang': {
            deps: ['bootstrap-table'],
            exports: '$.fn.bootstrapTable.defaults'
        },
      
    },
    map: {
        '*': {
            'css': '../libs/require-css/css.min'
        }
    },
    waitSeconds: 30,
    charset: 'utf-8' // 文件编码
});

config中paths用来设置AMD(异步模块定义)规范的库和js文件,shim是用来配不支持AMD规范的js,配好以后,假设现在 要使用jquery 和 bootstart ,只要require方法:

require(['jquery','bootstart'],function($,undefined){
    //该function将在引入jquery 和 bootstart完成之后执行。
});

引用自己写的js

在fastadmin中,我们并没有使用config配置我们自己写的js,如后台某个类增改查方法所在的js文件,是不是很好奇是怎么被调用的?

require.js 是模块化工具,要是用我们自己定义的js,首先得用模块化的方法编写js,使用define定义一个模块:

define('modelname',['jquery','xxxxx'],function($,xxx){
    var hehe = {
        function1:function(){
         
         },
        function2:function(){
         
         },
        function3:function(){
         
         },
    };
    return hehe;
});

这段代码如果也用php的思维来理解,你可以看作是:

require jquery.php;
reuqire hehe.php

hehe.function1();
hehe.function2();
hehe.function3();

这时候一定有人有疑问,在开发fastadmin的时候,我们并没有进行调用形如hehe.function1();的方法,那么我们的index,add,edit等页面对应的js代码是如何被执行的?

请大家看require-backend.js文件,Karson老大帮我们调用了:

所以我们只需写好对应的js文件,Karson老大帮我们根据控制器名和方法名自动调用了对应的js文件和对应的js方法。

如何了解fastadmin中的requirejs

先看admin/view/common/script.html,你会发现项目的入口js就是require-backend.js

然后看require-backend.js,你会发现其中使用config配置了一些第三方模块。并在最后调用了当前控制器和方法对应的js

image.png

总结

  1. 自己写一个js,要使用define,并在function体中return
  2. 调用其他js,使用require(),并在function体中编写业务代码
  3. require-backend.js中根据当前控制器名和方法名自动帮我们调用了对应的js文件和其中的方法

PS:本帖只是带你简单入门requirejs,并了解fastadmin中是如何使用requirejs的,requirejs还有不少具体的配置细节需要大家自己阅读官方文档

<think> 我们正在处理一个关于Fastadmin框架的问题,用户想知道如何在模板中调用分页并传递分类id等参数。 根据引用[1],我们知道在Fastadmin中,如果需要关联查询,需要在控制器中设置`protected $relationSearch = true;`,并且重写index方法。同时,在JS部分需要注意字段别名。 引用[2]提供了分页的基本原理:需要当前页码(page)、每页显示数量(rows)、总记录数(total),以及对应的SQL处理(使用LIMIT进行分页,并计算总页数)。 引用[3]展示了一个FastAPI的例子,但与我们当前问题无关,可以忽略。 引用[4]提到了Fastadmin中的selectpage控件,它用于选择数据,并且返回的数据格式为包含`list`和`total`的JSON。 在Fastadmin中,分页功能通常由后台控制器和前端JS共同完成。我们需要在控制器中处理分页数据,并在前端模板中使用分页标签。 步骤: 1. 在控制器中,设置分页参数并获取数据。 2. 将数据传递给视图,同时传递分页参数(如总记录数、每页显示数量等)。 3. 在视图模板中,使用Fastadmin提供的分页标签生成分页HTML。 同时,用户提到要传递分类id等参数,这意味着在分页的时候需要根据分类id来筛选数据,并且在翻页时保持这个参数。 具体实现: 一、控制器(PHP部分): 假设我们有一个名为`Article`的控制器,需要根据分类id(假设为`category_id`)来分页显示文章。 首先,在控制器中开启关联查询(如果需要关联分类表),并设置`relationSearch`属性为`true`(如果涉及关联表搜索)。 然后,重写`index`方法,加入分类id的过滤和分页处理。 示例代码片段: ```php protected $relationSearch = true; // 如果需要关联表查询则开启 public function index() { // 获取请求参数 $category_id = $this->request->param('category_id/d', 0); // 获取分类id,默认为0 // 构建查询条件 $map = []; if ($category_id) { $map['article.category_id'] = $category_id; // 注意:如果关联查询,可能需要指定表别名 } // 获取分页参数(当前页和每页数量) $page = $this->request->param('page/d', 1); $rows = $this->request->param('rows/d', 10); // 查询数据 $list = model('Article') ->where($map) ->order('id DESC') ->paginate($rows, false, ['page' => $page]); // 获取总记录数 $total = $list->total(); // 将数据赋值给模板 $this->assign('list', $list); $this->assign('page', $page); $this->assign('rows', $rows); $this->assign('total', $total); $this->assign('category_id', $category_id); // 将分类id传递给模板,以便在分页链接中保持 return $this->view->fetch(); } ``` 二、视图模板(HTML/JS部分): 在Fastadmin的模板中,我们可以使用内置的`pagelist`标签来生成分页HTML。同时,我们需要在分页链接中保留分类id参数。 示例模板代码: ```html <!-- 数据列表 --> <table> <!-- 表头省略 --> <tbody> {volist name="list" id="vo"} <tr> <td>{$vo.id}</td> <td>{$vo.title}</td> <!-- 其他列 --> </tr> {/volist} </tbody> </table> <!-- 分页 --> <div class="pagination">{$list->render()}</div> ``` 但是,默认的分页链接不会包含我们额外的参数(如`category_id`)。因此,我们需要扩展分页的URL参数。 在Fastadmin中,可以通过JS来修改分页链接。我们可以在页面加载时,为每个分页链接添加参数。 另一种方法是在控制器中,将分页对象传递给模板时,设置分页对象的参数。在ThinkPHP5(Fastadmin基于此)中,可以在创建分页对象时传入参数: 在控制器中,我们可以这样创建分页对象并传入参数: ```php $list = model('Article') ->where($map) ->order('id DESC') ->paginate([ 'query' => ['category_id' => $category_id] // 添加额外参数 ], $rows, false, ['page' => $page]); ``` 这样,分页链接中就会自动包含`category_id`参数。 三、前端JS处理(如果需要动态修改分页参数): 如果我们的分页需要通过AJAX加载,那么我们需要在JS中处理分页事件,并在请求中加入`category_id`参数。 例如,使用Fastadmin内置的`$.table`(如果使用Fastadmin的表格插件): ```js var table = $("#table").dataTable({ // ...其他配置 ajax: { url: $.fn.bootTable.defaults.extend.index_url, data: function (d) { // 添加额外参数 d.category_id = $('#category_id').val(); } } }); ``` 然后在分页按钮点击时,会重新请求数据,并携带`category_id`参数。 但是,如果用户的问题是在普通的页面跳转分页(非AJAX)中传递参数,那么通过上述控制器的分页对象设置`query`参数即可。 总结: 1. 控制器中处理分页,并通过`paginate`方法设置额外的查询参数(如`category_id`)。 2. 在模板中使用`{$list->render()}`生成分页链接,这些链接会自动包含参数。 3. 如果使用AJAX分页,需要在JS中设置请求参数。 注意:在关联查询时,如果字段名冲突,需要指定别名,如引用[1]所述。 根据用户的问题,主要是传递分类id等参数,所以重点在于如何在分页链接中加入这些参数。使用`paginate`方法的`query`参数可以解决。 最后,生成相关问题: §§相关问题§§ 1. 如何在Fastadmin中实现关联表的分页查询? 2. Fastadmin分页时如何传递多个额外参数? 3. Fastadmin中如何使用AJAX分页并保持参数传递? </think> 在 FastAdmin 模板中调用分页并传递分类 ID 等参数,需结合 PHP 控制器逻辑和前端 JS 处理。以下是完整实现方法: ### 一、PHP 控制器设置(核心步骤) 1. **启用关联查询与分页** 在控制器中设置关联查询标识并重写 `index` 方法: ```php protected $relationSearch = true; // 启用关联查询 public function index() { // 获取分类ID参数 $category_id = $this->request->param('category_id/d', 0); // 构建查询(带分类过滤) $list = $this->model ->with(['relationTable']) // 关联表 ->where('category_id', $category_id) // 分类过滤 ->paginate([ 'query' => ['category_id' => $category_id] // 关键:传递参数到分页链接 ]); $this->assign('list', $list); return $this->view->fetch(); } ``` [^1] 2. **分页参数说明** - `paginate()` 自动处理分页逻辑 - `'query' => ['category_id' => $category_id]` 确保分页链接携带分类 ID ### 二、前端模板处理(JS/HTML) 1. **分页渲染(HTML 部分)** 在模板文件中调用 FastAdmin 的分页组件: ```html <!-- 数据列表 --> <table> {volist name="list" id="vo"} <tr><td>{$vo.title}</td></tr> {/volist} </table> <!-- 分页控件 --> <div class="pagination">{$list|raw}</div> ``` 2. **JS 参数传递(AJAX 分页场景)** 若使用动态加载(如 SelectPage 控件): ```javascript $("#select-page").selectPage({ field: "category_id", data: { customParam: "value" // 自定义参数 }, formatResult: function(data) { return { list: data.list, total: data.total }; } }); ``` [^4] ### 三、关键注意事项 1. **字段冲突处理** 关联查询时字段需指定别名(如 `table.field AS alias`)避免冲突 [^1]。 2. **分页参数传递** - URL 示例:`/admin/article/index?page=2&category_id=3` - 控制器通过 `$this->request->param()` 获取参数 3. **数据格式要求** 远程分页接口需返回标准化 JSON: ```json { "list": [{"id": 1, "name": "示例"}], "total": 30 } ``` [^4] ### 四、完整工作流程 1. 用户访问带 `category_id` 参数的 URL 2. 控制器过滤对应分类数据 3. `paginate()` 自动生成分页 HTML 4. 前端渲染分页控件(含分类 ID 参数) 5. 翻页时自动携带原始参数请求新数据 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值