2013-03-15 55 views
3

有没有一种方法能靠它生活在视图的初始渲染CGridView 负荷数据,而是使其与初始页面加载后,后续的AJAX请求加载的第一页?的Yii:如何强制CGridview仅通过AJAX加载数据?

这主要是进行性能优化。有是相当缓慢的背后是一个CGridView数据模型,并且我希望能够有一个活泼的方式在页面加载,然后让数据与AJAX请求的几秒钟后加载。

回答

4

可以按如下步骤修改操作:

public function actionIndex() { 
    $dataProvider = new CActiveDataProvider('User'); // The dataprovider your grid uses 
    if (!$this->isAjaxRequest()) { 
    $dataProvider->criteria->addCondition('1 = 0'); // You could also use 0, but I think this is more clear 
    } 

    [...] 
} 

然后在JavaScript部分您的看法:

$(function() { // If you are using jQuery this is executed when the page is loaded 
    $.fn.yiiGridView.update("{id-of-your-grid-view}"); 
}); 
+0

isAjaxRequest()不是控制器的方法。它是CHttpRequest的一个属性。所以,虽然你可以检查Ajax请求,例如,如果(Yii的应用::() - >请求 - > isAjaxRequest)...然后通过加入条件和更新功能这个建议的方案进行,这并未”实际上工作。电网根本不加载。一旦我弄清楚,我会回来发布一个工作解决方案。 – 2013-09-07 17:09:20

0

布鲁尔峡谷非常接近,并感谢他的建议的答案,它把我放在正确的轨道上。这工作:

// Controller, after creating $dataProvider, before calling $this->render... 
if (!Yii::app()->request->isAjaxRequest) { 
    $dataProvider->criteria->addCondition('1 = 0'); 
} 

// View 
<script type="text/javascript"> 
$(window).load(function() { 
    $('#id-of-grid').yiiGridView('update'); 
}); 
</script> 
0

只写你的代码在控制器这样的:

$model= new Data('search'); 
$model->unsetAttributes(); 

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

if (!Yii::app()->request->isAjaxRequest) 
    $data->id=0; //or something that sure model return empty