覆盖Yii网格视图中的私有JS方法

Override a private JS method in Yii Grid View

本文关键字:JS 方法 Yii 网格 视图 覆盖      更新时间:2023-09-26

我想在yii'framework'zii'widgets'assets'gridview'jquery.yiigridview.js处扩展YiiGridView插件中的一个函数,以便将数据添加到插件进行的ajax调用中。

插件文件的完整来源可以在以下位置查看:https://code.google.com/p/yii/source/browse/trunk/framework/zii/widgets/assets/gridview/jquery.yiigridview.js

以下是我遇到的解决方案:

解决方案

  1. 目前,我正在使用ScriptMap,如下所示:http://www.yiiframework.com/forum/index.php/topic/31530-override-jqueryyiigridviewjs/

  2. 我也可以选择使用ajaxSend全局事件将我自己的数据添加到发送的每个请求中:http://api.jquery.com/ajaxSend/

  3. 指示可以通过重写$.fn.yiiGridView.update函数来实现这种功能的其他方法不适用,因为从Yii 1.1.9起,这种方法已被弃用。

问题

我想要实现的是改变:

$.ajax(options);

至:

options = $.extend({}, options, {data: myCustomData});
$.ajax(options);

而不必求助于方法1、2或3。如果这不可能,我想确认一下。

插件文件中的第270行位于:https://code.google.com/p/yii/source/browse/trunk/framework/zii/widgets/assets/gridview/jquery.yiigridview.js#270

IMHO,可接受的选项为1或3

1:
+使用核心功能
+只有一个脚本请求
-你可以打碎一些东西
3:
+安全(没有损坏任何东西)
-附加请求
-需要在每个文件中连接

我会选择选项1

在此处添加此内容仅供将来参考。

从这个问题中可以明显看出,我试图覆盖ajax调用中的data参数。

我需要这样做来将我的自定义数据(在本例中是过滤器)附加到data对象。

有更好的方法来实现这一点。与其试图侵入代码并更改数据对象,不如使用网格配置选项'filterSelector' => 'input[name^=filter]',来选择自定义过滤器。

生成的配置数组将是:

$this->widget('bootstrap.widgets.TbGridView', array(
    'type' => 'striped',
    'id' => 'grid-id',
    'selectableRows' => 0,
    'dataProvider' => $model->search(),
    'template' => "{items}'n{pager}",
    'filterSelector' => 'input[name^=filter]'
));

filterSelector选项会自动将匹配字段中的任何数据附加到每个ajax调用,从而无需重写。