php - Yii:如何将 yiiGridView.js 事件绑定(bind)到延迟加载的 CGridView

标签 php yii cgridview

我的 View 由一个 CJuiAutoComplete 小部件和一个最初为空的 div 组成。

<?php $roomsAvailableUrl = $this->createUrl('getavail');
$this->widget('zii.widgets.jui.CJuiAutoComplete', array(
    'name' => 'hotel',
    'source' => $this->createUrl('hotel/get'),
    'options'=>array(
    'select'=>"js:function(event, ui) {
        $.ajax({
            type: 'GET',
            url: '$roomsAvailableUrl',
            dataType: 'html',
            data: {
                'Viroomavail[place_id]': ui.item.id
            },
            success: function(response) {
                $('#rooms').html(response);
            }
        });
    }"
),
)); ?>
<div id="rooms"></div>

当用户做出选择时,JS-function 通过 ajax 调用另一个操作。该操作返回一个 GridView,该 GridView 部分根据提交的参数进行渲染。

public function actionGetAvail()
{
    if (Yii::app()->request->isAjaxRequest)
    {
        $model = new Viroomavail('search');
        $model->unsetAttributes();

        if (isset($_GET['Viroomavail']))
            $model->attributes = $_GET['Viroomavail'];

        $this->renderPartial('_grid_avail', array(
            'model' => $model,
        ));
    }
}

_grid_avail.php:

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'roomavail-grid',
    'dataProvider' => $model->search(),
    'filter' => $model,
    'ajaxUpdate'=>'#roomavail-grid',
    'ajaxUrl' => $this->createUrl('getavail'),
    'columns' => array(
       .......
    ),
));

GridView 被插入到“#rooms”div 中。 我已在主视图中注册了 CGridView 所需的资源。

$baseScriptUrl = Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('zii.widgets.assets')).'/gridview';
Yii::app()->getClientScript()->registerCssFile($baseScriptUrl.'/styles.css');
Yii::app()->getClientScript()->registerScriptFile($baseScriptUrl.'/jquery.yiigridview.js');

但我不知道如何将 yiigridview 客户端脚本($.fn.yiiGridView 函数)的事件绑定(bind)到新加载的网格。因此网格的过滤器不起作用。

如何让它发挥作用? 当然,我可以最初在主视图中渲染网格并在视觉上隐藏它。但我想以更优雅的方式实现这一点。

谢谢。

最佳答案

您可以使用afterAjaxUpdate (因为您的页面是使用ajax加载的):

$this->widget('zii.widgets.grid.CGridView', array(
    // ... options ...
    'ajaxUpdate'=>true,
    'afterAjaxUpdate'=>'aFunctionThatWillBeCalled', //
    // ... more options ...
));

您可以像这样添加js函数:

Yii::app()->clientScript->registerScript('some-script-id','function aFunctionThatWillBeCalled(id, data){
    console.log("id is "+id);
    // your jquery code to remember checked rows
}');

检查这里:

Yii CGridView javascript event on pagination

关于php - Yii:如何将 yiiGridView.js 事件绑定(bind)到延迟加载的 CGridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23477747/

相关文章:

PHP 提供闭包来确定数组中项目的唯一性

php - 启动CDbConnection时"Connecting string cannot be empty"错误

Yii和XSS,数据从哪里逃逸?

yii - 将类添加到 CGridView 中的文本框

mysql - 如何连接三个表并在 GridView 中获取值

php - Yii CGridView 按钮 - 调用参数化的 javascript 函数

php - Ajax 将格式化文本传递到另一个 php 文件并显示在文本区域中

javascript - 生成 JSON 数组

javascript - 如何解决本地存储的登录问题?

php - 如何获取最近查看的记录的id来执行cgridview,它对于yii中的每条记录都是唯一的?