Yii renderpartial (proccessoutput = true) Eviter la requête js Duplicate
Im la création d'un site qui fonctionne avec ajaxRequest, lorsque je clique sur un lien, il vous permettra de charger à l'aide de ajaxRequest. Lorsque je charge par exemple l'utilisateur/login UserController actionLoginj'ai renderPartial la vue avec processOUtput true donc, la js nécessaire à l'intérieur de ce point de vue sera généré, cependant si j'ai clientScriptRegister à l'intérieur de ce point de vue, avec les événements, comment puis-je éviter de générer de la scriptRegistered deux ou plusieurs en fonction de la ajaxRequest? J'ai essayé Yii::app()->clientScript->isSCriptRegistered('scriptId')
pour vérifier si le script est déjà enregistré, mais il semble que si vous avez utilisé ajaxRequest, le résultat est toujours fauxcar il ne sera vrai après que le rendu est terminé.
Contrôleur de code
if (Yii::app()->request->isAjaxRequest)
{
$this->renderPartial('view',array('model'=>$model),false,true);
}
Afficher Le Code
if (!Yii::app()->clientScript->isScriptregistered("view-script"))
Yii::app()->clientScript->registerScript("view-script","
$('.link').live('click',function(){
alert('test');
})
");
Si je demande pour le contrôleur pour la première fois, il fonctionne parfaitement (alerte 1 fois), mais si je demande de nouveau pour le même contrôleur sans actualiser ma page et juste à l'aide de ajaxRequest, l'alerte de sortie deux fois si vous cliquez dessus (parce qu'il garde sur la génération même si vous avez déjà enregistré une fois)
C'est la même chose si vous avez CActiveForm à l'intérieur de la vue avec la fonction jquery.. le corescript yiiactiveform sera appelée à chaque fois que vous renderPartial.
source d'informationauteur butching
Vous devez vous connecter pour publier un commentaire.
Pour éviter de base, y compris les scripts deux fois
Si vos scripts ont déjà été inclus dans une demande antérieure, utilisez cette fonction pour éviter d'inclure de nouveau:
Si vous avez des points de vue qui sont en train d'être rendu à la fois de manière indépendante et dans des fragments de HTML à être inclus avec l'AJAX, vous pouvez envelopper ce à l'intérieur de
if (Yii::app()->request->isAjaxRequest)
à couvrir toutes les bases.Pour éviter d'inclure les scripts jQuery deux fois (JS solution)
Il y a également la possibilité d'empêcher les scripts d'être inclus deux fois sur le côté client. Ce n'est pas directement pris en charge et un peu plus encombrant, mais dans la pratique, il fonctionne très bien et il ne vous oblige pas à le faire savoir sur le côté serveur ce qui se passe du côté client (c'est à dire les scripts qui ont été déjà inclus).
L'idée est d'obtenir le code HTML à partir du serveur et tout simplement dépouiller le
<script>
les balises de remplacement d'expressions régulières. Le point important est que vous pouvez détecter si jQuery de base des scripts et plugins ont déjà été chargées (parce qu'ils créent$
ou propriétés) et de le faire de façon conditionnelle:Il y a une carte des noms de fichiers et les objets qui ont été définis si le script correspondant a déjà été inclus; passer votre arrivée de HTML par le biais de cette fonction et il va vérifier et supprimer
<script>
balises qui correspondent à précédemment chargé des scripts.La fonction d'assistance
isDefined
est-ce:Pour éviter de placer des gestionnaires d'événement deux fois
Vous pouvez simplement utiliser un objet Javascript à retenir si vous avez déjà attaché le gestionnaire; si oui, de ne pas attacher de nouveau. Par exemple (afficher le code):
La façon la plus propre est de remplacer beforeAction(), afin d'éviter toute dupliqué base de script:
Noter que vous devez mettre l'exacte js nom du fichier sans le chemin d'accès.
Pour éviter d'inclure des fichiers de script à deux fois, essayez cette extension: http://www.yiiframework.com/extension/nlsclientscript/
Pour éviter de placer des gestionnaires d'événement deux fois, voir Jons réponse: https://stackoverflow.com/a/10188538/729324