Предотвратите загрузку jQuery-активов с помощью ajaxButton / ajaxSubmitButton в системе Yii

У меня есть ресурс загрузки 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', ) ); ?> 

Это довольно раздражающая проблема ИМО. Я решил создать производный класс 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)

Надеюсь, это поможет.

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

Используйте этот способ, чтобы предотвратить загрузку загружаемых javascript-файлов.

Вот еще один способ обойти эту неприятную проблему: отключить скрипты перед вызовом '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); 

Вы должны поместить вручную любые .js и .css-файлы, которые вы не хотите вставлять в html. Это позволяет вам включать и отключать все, что вам нужно.