【问题标题】:Yii: How do I bind yiiGridView.js events to late loaded CGridViewYii:如何将 yiiGridView.js 事件绑定到延迟加载的 CGridView
【发布时间】:2014-06-22 01:35:18
【问题描述】:

我的视图包含一个 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。

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 函数)的事件绑定到新加载的网格。因此网格的过滤器不起作用。

如何让它工作? 当然,我可以先在主视图中渲染网格,然后在视觉上对用户隐藏它。但我想以更优雅的方式实现这一目标。

谢谢。

【问题讨论】:

标签: php yii cgridview


【解决方案1】:

请注意renderPartial() 中的参数在做什么。 要实现您想要的,请在父视图中注册 js(您已这样做),然后在 ajax 中尝试

    Yii::app()->clientScript->scriptMap["*.js"]=false;
    $this->renderPartial('_grid_avail', array(
            'model' => $model,
        ),false,true);

首先,您将禁用 js 加载以防止双重加载,然后使用处理输出进行渲染。

【讨论】:

  • 谢谢你,先生,我已经试过了。不幸的是,它不能正常工作。我猜想,ajax 请求会创建自己的 Yii::app() 实例,因此 renderPartial() 的第四个参数(调用 CController::processOutput() 方法)不会处理父网页。
  • 我实际上有同样的情况,但没有过滤器(只有分页),它工作。如果这没有帮助,则渲染不可见的网格并使用$('#roomavail-grid').yiiGridView('update', {data: this.serialize()}); 更新它,这将是正确的方法。
【解决方案2】:

你可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多