Обновление данных просмотра CI через AJAX - PullRequest
1 голос
/ 23 апреля 2011

Я с радостью писал код, думая, что у меня больше не будет проблем (пока, по крайней мере), пока я не приду к AJAX-части моего приложения.

Сначала немного предыстории.Я работаю над приложением календаря / планировщика.Мой контроллер загружает данные (довольно сложный массив) из модели и передает их в представление в моей функции index ().Все хорошо, пока там.Теперь я хочу обновить свои данные через ajax.Я показываю несколько дат, и когда пользователь нажимает кнопки «предыдущий» или «следующий», я хочу показать предыдущий / следующий месяц.

В прошлом мне удавалось делать это с очень грязным и простым плохим кодом.Я переписал свой код с нуля, но теперь я застрял.У меня есть вызов AJAX для следующей функции:

    public function change_dates()
{
    $month = $this->input->post('month');
    $year = $this->input->post('year');
    $dates = $this->planner_model->create_date_list($month, $year);

    // echo $dates back to ajax? :(
}

Я беру значения записей, отправляю их в мою модель, сохраняю данные в массиве, а затем застреваю.Поскольку массив данных является сложным, у меня есть цикл foreach, среди прочего, на мой взгляд.Если я просто верну его назад к вызову ajax моего представления, я ничего не могу с этим поделать.Я не могу использовать .html() здесь, чтобы получить мои данные в моем представлении.Мне нужен способ обновить весь массив в моем представлении новыми значениями, если это имеет смысл?Я пробовал что-то вроде $this->load->vars(), но я немного новичок и даже не знаю, правильный ли это способ, ха-ха.

Заранее спасибо.

1 Ответ

0 голосов
/ 24 апреля 2011

Простой, надежный способ:

Убедитесь, что ваша страница использует $this->load->view() для загрузки фрагмента представления (HTML, который создает календарь) отдельно от верхнего, нижнего колонтитула и т. Д.

Когда вы делаете AJAX-вызов на change_dates(), заставьте его сделать свое дело, затем загрузите только этот файл просмотра, передавая новые данные с $this->load->vars() или $this->load->view('calendar', $data).Если вам нужно только загрузить представление, если это AJAX-запрос, просто определите вызов AJAX:

public function change_dates()
{
    $month = $this->input->post('month');
    $year = $this->input->post('year');
    $dates = $this->planner_model->create_date_list($month, $year);

    if ($this->input->is_ajax_request()) // Available as of CI 2.0
    {
        $data['dates'] = $dates;
        $this->load->view('calendar', $data);
        // You may need to load other data here, If so, consider a common function that
        // can be shared with your main view to render the calendar
    }
}

В вашем jQuery вы будете ожидать html в качестве возвращаемого значения.Просто возьмите значение и загрузите его в ваш div или там, где отображается календарь с помощью функций html () или load () jQuery.По сути, вы просто перезагружаете все, что обеспечивает правильный вывод.

$.get(url, function(response) {
    $('#main_content').html(response);
}, 'html');// will usually use auto detection

// Or when you KNOW you're expecting HTML

$('#main_content').load(url);

// Or without the ajax detect (slower, less recommended)

$('#main_content').load(url + ' #main_content');

Точный, сложный способ:

Используйте вышеуказанные методы, но echo /выйдите из json_encode () данных в любую нужную форму, затем убедитесь, что вы ожидаете возвращаемое значение json от вашего jQuery.Теперь вы получите массив, с которым вы можете манипулировать документом по вашему выбору.


Если вы используете более старую версию, чем 2.0 - Пора обновить !, но здесьэто функция, которую они используют для обнаружения ajax (не так уж много):

public function is_ajax_request()
{
    return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...