2012-06-18 62 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中。这使您可以启用和禁用任何您想要的功能。