У меня есть ресурс загрузки 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. Это позволяет вам включать и отключать все, что вам нужно.