формирование AjaxLink в CTreeView

Здравствуйте, коллеги. Возникла следующая ситуация: есть layout, в который подключается компонент CTreeView:


<?php $this->widget('CTreeView',array(

                         'url' => array('ajaxFillTree'),

                         'cssFile'=>Yii::app()->request->baseUrl.'/css/treeview.css'

                     ));?>

К.О.: дерево заполняется ajax’ом.

Заполняется таким образом:


public function actionAjaxFillTree()

        {

            if (!Yii::app()->request->isAjaxRequest) {

                exit();

            }

            $parentId = NULL;

            if (isset($_GET['root']) && $_GET['root'] !== 'source') {

                $parentId = (int) $_GET['root'];

            }   

            $children = Catalog::model()->getChildren($parentId);

            if(is_array($children))

            {

                foreach($children as $parent)

                {

                    $dataTree[]=$this->formatData($parent);

                }

                echo CTreeView::saveDataAsJson($dataTree); 

            }

        }

К.О.: данные отдаются в json.

Теперь собственно проблема: мне нужно чтобы при щелчке по элементу из списка вызывалось действие контроллера и перерисовало главную область экрана. Вроде бы ничего сложного - CHtml::ajaxLink(…, ‘update’=>’#content’) при рисовании элемента списка. Но данные передаются json’ом, поэтому генерируемые для ajaxLink скрипты в отдачу не попадают. Id’шки рисуются какие надо, а действие не вызываются. Что делать, как быть? Есть идеи? Вручную регистрировать js скрипты каждый раз? Заранее благодарен!

С CTreeView не приходилось работать. Но кажется я понял в чем проблема.

Попробуй назначать обработчики через .delegate() тогда перезагрузка содержимого дерева не повлияет на однажды установленные отработчики событий.

Спасибо за ответ! Но, боюсь, Вы меня неправильно поняли. В любом случае, я уже реализовал данный механизм, правда, признаться, очень некрасивым решением. Добавил при формировании дерева в поле text ссылку с указывающим id и в тот же view, где отображается CTreeView добавил


<script>

    $(document).ready(function(){

       $('#treeviewID a').live('click', function(){

           $.ajax({

           url:'<?=$this->createUrl('default/view')?>',

           type: 'GET',

           data: 'id='+$(this).attr('id'),

           success: function(html){

               $('#content').html(html);

           }

           });     

       });

    });

</script>

Повторюсь, это неудачное решение, наверняка можно придумать получше.

Мне кажется, что вы реализовали кодом именно то, что я говорил, .live() это тот же .delegate(), только кажется .live уже "нежелательна"

И вместо вставки скрипта внутри тега <script> в Yii лучше использовать clientScript, например


Yii::app()->clientScript->registerScript("someName",$js, CClientScript::POS_READY);

Действительно, похоже на правду. Привык пользоваться live, про delegate не слышал. Буду иметь в виду, благодарю Вас за содержательные ответы.