通过AJAX更新CI视图数据

时间:2011-04-23 19:13:02

标签: php ajax arrays codeigniter

我很高兴编码,认为我不再遇到问题(至少现在,至少),直到我来到我的应用程序的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? :(
}

我获取post值,将它们发送到我的模型,将数据保存在数组中,然后我就卡住了。因为数据数组很复杂,所以在我看来,我有一个foreach循环。如果我只是将它回到我的视图的ajax调用中,我就无法对它做任何事情。我不能在这里使用.html()来获取我的数据。我需要一种方法来更新我的视图中的整个数组与新值,如果这是有道理的?我试过像$this->load->vars()这样的东西,但我有点像新手,我甚至不知道这是不是正确的做法,哈哈。

提前致谢。

1 个答案:

答案 0 :(得分:0)

简单可靠的方式:

确保您的网页使用$this->load->view()与页眉,页脚等分开加载视图片段(创建日历的html)。

当您对change_dates()进行AJAX调用时,请执行此操作,然后仅加载 该视图文件,并使用$this->load->vars()或{{1}传递新数据}}。如果您只需加载视图(如果它是AJAX请求),只需检测AJAX调用:

$this->load->view('calendar', $data)

在你的jQuery中,你会期望html作为返回值。只需获取值并将其加载到div或使用html()load() jQuery函数显示日历的任何位置。你基本上只是重新加载整个东西,这可以确保你获得正确的输出。

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
    }
}

精确,困难的方式:

使用上面的方法,但回显/退出json_encode()数据到你需要的任何形式,然后确保期望jQuery的json返回值。现在,您将获得一个数组,您可以根据自己的选择操作文档。


如果你使用的是旧版本而不是2.0 - It's time to upgrade !,但这里是他们用于ajax检测的功能(对它来说不多):

$.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');