1

複数の要素を含む CListView があります。これらの各要素には ajax リンクがあります。

最初は ajax リンクがうまく機能していましたが、CListView でページを切り替えると、ajax リンクが機能しなくなりました。

これが私のコントローラーです:

$dataProvider = News::model()->listeNews();
$this->renderPartial(
    '_list',
    array('dataProvider' => $dataProvider,),
    false,
    true
);
Yii::app()->end();

CListView:

<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',
    'enablePagination'=>true,
    //don't change the id, used to update the number of news to displau
    'id'=>'list',
    'cssFile' => Yii::app()->theme->baseUrl . '/css/widgets/listview/styles.css',
    'template'=>"{pager}\n{items}\n{pager}",
    'pager' => array(
        'class' => 'PagerSA',
        'cssFile'=>Yii::app()->theme->baseUrl . '/css/widgets/pager.css',
        ),
)); ?>

そしてアイテムビューの ajax リンク:

<?php echo CHtml::ajaxLink(
    '<div class="nb_like" id="nb_like_'.$data->id.'">' . $data->like . '</div>',
    array('news/like','id'=>$data->id, 'type'=>'like'),
    array('update'=>'#nb_like_'.$data->id),
    array('class'=>'btn_like', 'id'=> 'like_' . $data->id)
);?>

更新: ajax リクエストを見ると、javascript が渡されていることがわかりますが、何も変わりません

<script type="text/javascript">
/*<![CDATA[*/
jQuery('#list').yiiListView({'ajaxUpdate':['list'],'ajaxVar':'ajax','pagerClass':'pager','loadingClass':'list-view-loading','sorterClass':'sorter','enableHistory':false});
$('body').on('click','#like_2810',function(){jQuery.ajax({'url':'/index-local.php/news/like?id=2810&type=like','cache':false,'success':function(html){jQuery("#nb_like_2810").html(html)}});return false;});
/*]]>*/
</script>
4

2 に答える 2

1

私はマイケルに同意します。この場合、プレーンな Jquery を使用する方が適切です。これを行う Yii の方法は、より複雑に見えます。考えられる解決策は次のとおりです。

index.php を表示:

<div class="col1"> <?php $this->renderPartial('_ajaxContent', array('model'=>$model)); ?> </div>

ビュー_ajaxContent.php

<p> echo $model->field;  </p>

_new.php (CListView アイテム):

<li>
    <a class="news" href="<?php echo CHtml::normalizeUrl(array("/ajax/id/{$data->id}"))?>"> Link name </a>        
</li>

jquery:

$('.new').live("click", function(e) {
        var href = $(this).attr('href');      
        $.ajax({
            url: href,
            type: "GET",
            dataType: 'text',
            success: function(result){
                var val = $('.col1').html(result);
            }
        });
        return false;
    });

コントローラ

public function actionAjax($id) {
        $data = array();
        $model = News::model()->findByPk($id);
        $this->renderPartial('_ajaxContent', $data, false, true);
    }

基本的に live 関数を使用して、新しい要素に対しても jquery イベントをバインドします。それらが破壊され、動的に再作成されているため、それらを失います。

于 2013-06-20T00:26:59.190 に答える