2012-08-14 5 views
1

J'ai un CListView qui utilise ajaxLink() dans le fichier _view.Yii ajaxLink() ne fonctionne qu'une seule fois

Voir (index.php)

<?php 

Yii::app()->clientScript->registerScript('ajaxUpdate', 
" 
//javascript function to update the listview using ajax 
function updateItemList(){ 
    $.fn.yiiListView.update('itemList'); 
    return false; 
} 

", CClientScript::POS_READY); 

?> 
<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider, 
    'itemView'=>'_view', 
    'id'=>'itemList', 

)); ?> 

partielle

(de _view.php)

<?php echo CHtml::ajaxLink('Delete',array('libdbitems/delete','id'=>$data->id), 
       array('type'=>'POST','success'=>'function(){updateItemList()}'), 
       array('confirm'=>'Are you sure you want to delete this item?', 
        'id'=>'delete-'.$data->id)); ?> 

Le contrôleur est fondamentalement juste la valeur par défaut actionIndex() qui est généré avec Gii.

Voici le problème: lorsque je clique sur mon lien Delete la première fois après un chargement de page, il se comporte comme prévu. Après cela, en cliquant sur Delete ne fait rien. (Il actualise le ListView, mais aucune modification n'est faite.)

Je suis assez sûr que le problème réside dans la façon dont Yii lie les événements click() à mes liens en javascript, mais je ne sais pas comment résoudre le problème. J'ai essayé d'utiliser l'option live=true comme d'autres l'ont suggéré, mais cela ne fait rien.

Est-ce que quelqu'un sait comment résoudre ce problème afin que mon lien Supprimer fonctionne plusieurs fois sans avoir à recharger la page?

Répondre

1

Eh, une solution stupide. J'ai réalisé que j'avais accidentellement laissé un CHtml::$liveEvents = false dans mon contrôleur que j'ai mis là alors que j'étais encore plus tôt dans la phase de dépannage. La solution est simplement de laisser CHtml::$liveEvents = true (par défaut) et de s'assurer que tous les liens ont des ID uniques.

2

Votre lien de suppression fait-il partie de la liste d'éléments actualisée? Si c'est le cas, le script ne se ré-enregistrera pas avec le nouveau lien lorsqu'un nouveau lien est créé.

Deux options:

1) Assurez-vous que votre lien n'est pas rafraîchi, et est un aspect permanent de la page

2) Ecrire un gestionnaire jQuery personnalisé plutôt que d'utiliser ajaxLink de Yû. Vous devrez utiliser .on et les événements délégués. Quelque chose de la forme:

$("#parentContainer").on("click", ".deleteLinkClass', updateItemList) 

Lorsque le parentContainer est un élément permanent sur la page, et deleteLinkClass sera une classe, vous devrez attribuer aux liens de suppression que vous utilisez.

+0

Bonne suggestion, et il aurait travaillé pour écrire un gestionnaire personnalisé. Heureusement, j'ai corrigé une erreur stupide dans mon code. Vous avez voté de toute façon. – penco

Questions connexes