2012-06-18 66 views
3

我在我的佈局中使用了jQuery加載資源,我想使用CHtml::ajaxButton/ajaxSubmitButton。 但是當我在運行時使用它與另一個渲染器時,它再次加載jQuery資產併發生錯誤。 如何防止加載腳本?防止在Yii框架中使用ajaxButton/ajaxSubmitButton加載jQuery資產

<?php echo CHtml::ajaxSubmitButton('Submit', 
             CHtml::normalizeUrl(array('site/AjaxRequest/30')), 
             array(
             'error'=>'js:function(){ 
              alert(\'error\'); 
             }', 
             'beforeSend'=>'js:function(){ 
              alert(\'beforeSend\'); 
             }', 
             'success'=>'js:function(data){ 
              alert(\'data from server: \'+data); 
             }', 
             'complete'=>'js:function(){ 
              alert(\'complete\'); 
             }', 
             //'update'=>'#response', 
             ) 
            ); 
    ?> 
+0

請向我們展示您的jQuery資產的佈局加載。 – sensorario

回答

6

這是一個非常惱人的問題IMO。我解決的方法是創建一個派生類CClientScript,並用其作爲clientScript組件(你可以在你的配置文件來覆蓋類型):

'clientScript' => array 
(
    'class'      => 'MyClientScript', 
), 

我的類覆蓋了「registerCoreScript」功能,這是用於註冊Yii包含的jQuery和其他基本腳本。 我在那裏做的幾乎是添加一個ajax的檢查,而不是將它傳遞給父類,如果是的話。一個Ajax調用期間

public function registerCoreScript($sName) 
{ 
    if (Yii::app()->request->isAjaxRequest) 
     return $this; 

    return parent::registerCoreScript($sName); 
} 

這可以防止加載任何核心腳本(並重新加入資產): 它看起來是這樣的。

你可以做其他功能同樣在那裏太(如registerScriptFile)

希望有所幫助。

6
Yii::app()->clientScript->scriptMap=array(
        'jquery.js'=>false, 
        'jquery.ba-bbq.js'=>false, 
        'jquery.yiilistview.js'=>false 
       ); 

使用這種方式來防止加載已加載的JavaScript文件。

+1

Ajax啓動的局部渲染總是一個新的綜合瀏覽視圖,所以腳本總是「未加載」。但是,如果將它與某些isAjaxRequest魔術結合使用,則可以使用它。 – Blizz

1

這裏是另一種方式來繞過這個惱人的問題:禁用腳本之前去「渲染」撥打:

Yii::app()->clientScript->corePackages = array(); 
    Yii::app()->clientScript->scriptMap = array('jquery.yiigridview.js' => false, 
               'CGridView.css' => false, 
               'pager.css' => false, 
               ... 
               'jquery-ui-i18n.min.js'=> false,); 
    echo $this->renderPartial('myView',array('model'=>$model, 'dataProvider'=>$dataProvider),true,true); 

您已經手工你沒有任何的.js和.css文件放想要插入到html中。這使您可以啓用和禁用任何您想要的功能。