Очень странное поведение jQuery load () с CodeIgniter - PullRequest
0 голосов
/ 02 июня 2011

Я действительно не могу понять, что здесь происходит.Я использую метод jQuery load () для замены некоторого HTML на странице.В этом случае оно должно заменить текущее сообщение тем, которое выбрано пользователем из списка.Все работает как положено, за исключением одной важной вещи.Когда HTML возвращается, он добавляет слово «ARRAY» перед чем-либо еще.Нет другой информации (как вы могли бы получить из var_dump ()) и нет тегов.Буквально, просто слово заглавными буквами!Если я загружаю вид без использования AJAX, то он рендерится как положено.Разница лишь в том, что запрос был сделан с помощью AJAX.Вот соответствующий код:

js: (все упаковано в ready ())

$('.message_summary').click(function() {
        // get message id
        id = $(this).attr('id');

        // load the new message first so that user can get on with reading it
        $('#message_window').load($.baseurl+'messages/get_message/'+id);

        // mark as read
        $.get($.baseurl+'messages/ajax/mark_as_read/'+id);

        // get current tag id
        $.get($.baseurl+'messages/get_current_tag', 
            function(data){
                            // get the message count
                            $.get($.baseurl+'messages/ajax/set_new_message_count/'+data,
                                    function(msg_count)
                                    { 
                                        $('.new_message_count_'+data).html(msg_count);
                                    }
                                );
            });           
});

Контроллер CI:

 public function get_message($message_id=false)
    {
        if($message_id)
        {               
            // get an individual message and prepare for display
            $message = $this->messages_m->get_single_message($message_id);

            foreach($this->tags['id'] as $index => $tag)
            { 
                $tag_options[$tag] = $this->tags['tag_name'][$index];
            }


            $main_message = array(
                                    'message_id'    => $message_id,
                                    'tag_name'      => $message->tag_name,
                                    'tag_options'   => $tag_options,
                                    'sender' => $message->first_name.' '.$message->last_name,
                                    'date_received' => date($this->config->item('date_time_format'), $message->created_at),
                                    'subject' => $message->subject,
                                    'content' => $message->message
                                );                                    
            if($this->input->is_ajax_request())
            {
                return $this->load->view('partials/message_view', $main_message);
            }
            else
            {
                return $this->load->view('partials/message_view', $main_message, true);
            }
        }

Файл представления - это просто HTML с некоторымипеременные php.

У кого-нибудь есть идеи?!?!

1 Ответ

3 голосов
/ 02 июня 2011

Я попытаюсь помочь вам отладить ответ, а не похоронить в комментариях.

Мы попробовали if($this->input->is_ajax_request()) exit('Hello'); в качестве первой строки get_message(), и результат был Arrayhello. Это заставляет меня поверить, что где-то вы проверяете AJAX-запрос и echo запрашиваете какой-то массив, поскольку именно это произойдет, если вы попытаетесь это сделать.

Мой первый совет : вернитесь к своему __construct() в том же контроллере и сделайте то же самое. Если вы все еще получаете тот же результат, вернитесь еще дальше, возможно, к используемой библиотеке. Если вы больше не видите Array, начните использовать код выхода немного дальше по дороге, пока не найдете точку, где, кажется, она срабатывает. К вашему сведению, поскольку вы сказали, что вы новичок в концепции отладки кода, это не способ отладки, это всего лишь один способ.

Кроме того, кажется, из вашего комментария вы теперь получаете Array вместо заглавной версии? Это странно, это не звучит правильно. Убедитесь, что вы читаете фактический ответ в Firebug, а не то, что видно на экране на вашей странице.

В сторону : Небольшой полезный совет (что я и делаю): установите $this->input->is_ajax_request() в качестве константы, например IS_XHR или AJAX, где-нибудь, как в вашем индексе, файле констант или конфигурации. Это просто облегчает работу. Будет ли запрос изменен с ajax на non-ajax в одном запросе? Нет. Просто посмотрите исходный код на system/core/Input.php, это очень просто. Пример:

define('AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest');

Это буквально то, что делает класс Input, хотя это немного запутано. Теперь вы можете просто использовать:

 if (AJAX) do_ajax_stuff();

Просто личные предпочтения, но я нахожу это очень полезным - и это немного меньше ресурсов, используемых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...