Php 通过AJAX更新CI视图数据

Php 通过AJAX更新CI视图数据,php,ajax,arrays,codeigniter,Php,Ajax,Arrays,Codeigniter,我很高兴地编写代码,认为在应用程序的AJAX部分之前,我不会再遇到问题(至少现在是这样) 首先,一点背景知识。我正在开发日历/计划器应用程序。我的控制器从模型加载数据(相当复杂的数组),并将其传递到我的index()函数中的视图。在那之前一切都很好。 现在,我想通过ajax更新我的数据。我正在显示一组日期,当用户单击“上一个”或“下一个”按钮时,我想显示上一个月/下一个月 在过去,我已经能够用超级混乱和糟糕的代码来实现这一点。我现在从头重写代码,但现在我被卡住了。我对以下函数进行了AJAX调用:

我很高兴地编写代码,认为在应用程序的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()
这样的东西,但我有点新手,我甚至不知道这样做是否正确,哈哈

提前感谢。

简单可靠的方法: 确保页面使用
$this->load->view()
分别从页眉、页脚等加载视图片段(创建日历的html)

当您对
change_dates()
进行AJAX调用时,让它做它该做的事情,然后只加载该视图文件,使用
$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中,或者使用或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');

精确而困难的方法: 使用上述方法,但将数据回送/退出到所需的任何形式,然后确保从jQuery中获得json返回值。现在,您将获得一个数组,您可以使用该数组来操作文档,无论您选择什么


如果您使用的是2.0-以上的旧版本!,但以下是他们用于ajax检测的函数(不多):


谢谢成功了。唯一的问题是,我现在不能再使用jQuery实现我的fadeIn()效果了,因为它会在整个div中消失。现在很好。谢谢!只需先执行hide(),然后执行fadeIn(),当您获得数据时,这很容易!是的,但是当我把整部片子都拍下来的时候很难看,因为它有背景之类的;)我在里面有一个列表,我过去经常在上面做淡入淡出效果,但现在我正在做“div level”。除非我将列表设置为显示:无,并在获取数据后淡入?使用另一种方法更新答案:)您确实可以使用多种技巧来模拟仅部分页面使用方法1重新加载,但这将是详细的代码,我还没有看到您的页面。我将要淡入显示的列表放入其中:无,我只是在用.html()加载新数据后淡入。看起来就像我现在想要的一样。谢谢你的时间!
public function is_ajax_request()
{
    return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest');
}