2012-09-16 17 views
9

Używam następujący kod do generowania ajax request:Jak wyłączyć autoloading jQuery na żądanie Ajax w Yii?

echo CHtml::dropDownList('teamA', '', EnumController::getTeamOption(), array(
     'empty' => '(Team/Single)', 
     'ajax' => array(
      'type'=>'POST', 
      'url'=> $url, 
      'update'=>"#resultA", 
      //'data'=>"js:$('#teamA').hide().fadeIn()" 
     ) 
    ) 
); 

w moim głównym układzie, mam następujący:

<?php Yii::app()->clientScript->scriptMap=array('jquery.js'=>false);?> 
<?php Yii::app()->clientScript->scriptMap=array('jquery.min.js'=>false);?> 

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js"></script> 

Yii się ładuje jQuery skopiować z aktywów, a następnie - - kolejna kopia, bezpośrednio od Google. Chcę użyć tylko kopii Google i zmusić Yii, aby nie ładowała własnej kopii z zasobów. Jak mogę to zrobić?

Odpowiedz

17

W Yii nigdy nie powinieneś nigdy kodować żadnych informacji javascript w głównym układzie.

Yii może ustalić, czy skrypt klienta (javascript) był już zawarty, ale w przypadku podstawowych skryptów (takich jak jquery lub jqueryui) trzeba zmodyfikować te pakiety w pliku konfiguracyjnym.

Otwórz plik konfiguracyjny main.php i dodać wszystkie pakiety js musisz ramach komponentu CClientScript (należy dodać go wewnątrz components), podobnie jak to:

'clientScript'=>array(
    'packages'=>array(
    'jquery'=>array(
     'baseUrl'=>'//ajax.googleapis.com/ajax/libs/jquery/1.8/', 
     'js'=>array('jquery.min.js'), 
     'coreScriptPosition'=>CClientScript::POS_HEAD 
    ), 
    'jquery.ui'=>array(
     'baseUrl'=>'//ajax.googleapis.com/ajax/libs/jqueryui/1.8/', 
     'js'=>array('jquery-ui.min.js'), 
     'depends'=>array('jquery'), 
     'coreScriptPosition'=>CClientScript::POS_BEGIN 
    ) 
), 
), 

Następnie, za każdym razem trzeba jQuery wystarczy dodać ten przed kodem:

$cs = Yii::app()->getClientScript(); 
$cs->registerCoreScript('jquery'); 

Yii następnie obejmować jQuery (lub inny skrypt) tylko raz, nawet jeśli nazywają go kilka razy w kodzie.

+0

wow! dzięki milionowi ... i tutaj myślałem, że wiedziałem już coś o Yii :) –

+0

Dla innych plików JS (nie tych zdefiniowanych jako "podstawowe skrypty" w konfiguracji) można użyć isScriptFileRegistered() Zobacz: http: // www .yiiframework.com/doc/api/1.1/CClientScript # isScriptFileRegistered-detail – taseenb

+1

Jeśli używasz registerScript (File) z POS_READY, nie musisz rejestrować jquery ręcznie, jest on rejestrowany automatycznie. Jednak musisz ręcznie zarejestrować jquery-ui. – Narretz

6

Postępując zgodnie z instrukcjami z Yii Special Topics Performance, zrobiłem szybki test, i to działało:

Na szczycie głównej układ:

<?php 
$cs=Yii::app()->clientScript; 
$cs->scriptMap=array(
    'jquery.js'=>false, 
    'jquery.ui.js' => false, 
);?> 

W sekcji <head> głównej układ:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js"></script> 

lub

<?php echo CGoogleApi::init(); ?> 

<?php echo CHtml::script(
    CGoogleApi::load('jquery','1.7.2') . "\n" . 
    CGoogleApi::load('jqueryui','1.8.17') 
); ?> 

W rzeczywistości używałbym pomocnika CGoogleApi, ale jsapi najwyraźniej nie może załadować wersji jquery wyższych niż te w moim przykładzie! Wydaje mi się, że jest to powolne aktualizowanie w Google, ponieważ nie działa również w zwykłym pliku.

A może plik js był nadal w pamięci podręcznej?

+0

dzięki! nie do końca to, czego szukałem, ale świetnie wiedzieć o CGoogleApi - gdzie widziałeś to w dokumentacji? –

+0

Mam link zawarty w mojej odpowiedzi, po prostu przewiń trochę. To oficjalne dokumenty, więc myślę, że jest więcej sposobów na zrobienie tego, chociaż odpowiedź e.a. jest czystsza, ponieważ działa z funkcją rejestru. – Narretz

+0

'CGoogleApi :: load ('jquery', '1.7.2'). "\ n" .' nie istnieje. jak załadowałbyś najnowszą jquery? – shorif2000

2

To będzie działać

<?php  
     $cs=Yii::app()->clientScript; 
     $cs->scriptMap=array(
     'jquery.js'=>false, 
     'jquery.ui.js' => false, 
); ?> 
Powiązane problemy