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 に答える