我的观点包含 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函数会调用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将插入&#34;#rooms&#34; 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 函数)的事件绑定到新加载的网格。因此,网格的过滤器不起作用。
如何让它运作? 当然,我可以在主视图中初始渲染网格,并在视觉上将其隐藏。但我希望以更优雅的方式实现这一目标。
谢谢。
答案 0 :(得分:3)
您可以使用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
}');
点击此处:
答案 1 :(得分:0)
请注意renderPartial()
中的参数。
要实现你想要的,在父视图中注册js(你做到了),然后在ajax中尝试
Yii::app()->clientScript->scriptMap["*.js"]=false;
$this->renderPartial('_grid_avail', array(
'model' => $model,
),false,true);
首先你将禁用js加载以防止双重加载,然后使用处理输出来禁用renderPartial。