4

我的布局上有 jQuery 加载资产,我想使用CHtml::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',
                                        )
                                    );
    ?>
4

3 回答 3

7

这也是 IMO 一个非常烦人的问题。我解决的方法是创建 CClientScript 的派生类并将其用作 clientScript 组件(您可以覆盖配置文件中的类类型):

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

我的类重写了“registerCoreScript”函数,该函数用于注册 jQuery 和 Yii 包含的其他基本脚本。我在那里所做的几乎就是添加对ajax的检查,如果是的话,不要将其传递给父类。它看起来像这样:

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

   return parent::registerCoreScript($sName);
}

这可以防止在 ajax 调用期间加载任何核心脚本(并再次添加资产)。

您也可以对其中的其他功能执行相同的操作(例如 registerScriptFile)

希望有帮助。

于 2012-06-18T07:34:07.167 回答
6
Yii::app()->clientScript->scriptMap=array(
                    'jquery.js'=>false,
                    'jquery.ba-bbq.js'=>false,
                    'jquery.yiilistview.js'=>false
                ); 

使用这种方式来防止加载已经加载的 javascript 文件。

于 2012-06-18T07:46:43.463 回答
1

这是绕过这个烦人问题的另一种方法:在 de 'render' 调用之前禁用脚本:

    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);

您必须手动放置您不想插入到 html 中的任何 .js 和 .css 文件。这使您可以启用和禁用您想要/需要的任何东西。

于 2012-06-18T07:47:00.040 回答