【问题标题】:Updating CI view data through AJAX通过 AJAX 更新 CI 视图数据
【发布时间】:2011-04-23 19:13:01
【问题描述】:

我很高兴地编码,认为我不会再遇到问题(至少现在是这样),直到我来到我的应用程序的 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()之类的东西,但我有点新手,我什至不知道这样做是否正确,哈哈。

提前致谢。

【问题讨论】:

    标签: php ajax arrays codeigniter


    【解决方案1】:

    简单可靠的方法:

    确保您的页面使用 $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 或使用 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');
    

    精确而困难的方法:

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


    如果您使用的是早于 2.0 的版本 - It's time to upgrade!,但这里是他们用于 ajax 检测的函数(不多):

    public function is_ajax_request()
    {
        return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest');
    }
    

    【讨论】:

    • 谢谢;那行得通。唯一的问题是我现在不能用 jQuery 做我漂亮的 fadeIn() 效果,因为它会在整个 div 中淡入淡出。那好吧。没关系。非常感谢!
    • 只要先做一个 hide(),然后在获取数据时再做一个 fadeIn(),很简单!
    • 是的,但是当我淡入()整个 div 时它很丑,因为它有背景等;)我有一个列表,我曾经对它做淡化效果,但现在我'正在处理'div级别'。除非我将列表设置为 display: none 并在获取数据后将其淡入?
    • 用另一种方法更新答案 :) 你真的可以做一些技巧来模拟只有部分页面重新加载方法 1,但这将是详细的代码,我还没有看到你的页面.
    • 我将要淡入的列表放入 display:none,我只是在使用 .html() 加载新数据后使其淡入。看起来就像我现在想要的一样。感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多