1

我目前正在重写我的整个站点,以使其与 CI 兼容。一般来说,我对 CI 和 MVC 模式还很陌生。我按照本教程为 MVC 模式的视图部分制作了一个相当不错的模板。问题是,我的很多网站都使用 jQuery/AJAX 来使其更具动态性。例如,在我网站上的所有页面上,我都有一个输入字段,它使用 jQuery 在 keyup 时加载 PHP 文件。

<script type="text/javascript">
    $("#search_bar").keyup(function(){
        var search = $("#search_bar").val();
        var url = "search_bar.php";
        var data = "q="+ search;

        $('#livesearch').load(url, data);
        $("#livesearch").slideDown("fast");
    });
</script>

<input type='text' maxlength='30' id='search_bar' autocomplete='off' placeholder='Browse Teams' />
<div id='livesearch' style='display:none;'></div>

加载结果所需的所有后端工作都发生在通过 jQuery (search_bar.php) 加载的 PHP 文件中。那么,“search_bar”是否应该是它自己的 View,由它自己的 Controller 触发,然后由一个名为“search_bar”的模型建模?同样,我对 MVC 模式非常陌生,并且不太确定如何将 AJAX 与 CI 等面向对象的框架正确集成。

谢谢

4

3 回答 3

0

您应该从视图转到控制器:

<script type='text/javascript' language='javascript'>
    $('#search_bar').keyup(function(){
        $.ajax({
                url: 'search_bar.php',
                type:'GET',
                data: {q: search,
                success: function(result){
                        //Insert code here
                    } // End of success function of ajax form
                }); // End of ajax call
    });
    </script>

然后在您的控制器中,如有必要,加载模型:

public function weigeren() {
        $user = $this->CI->authex->getUserInfo();
        $data['title'] = "Test";
        $this->load->model('search_model');
        $query = $this->input->get('q');
        if (isset($user)) {

          echo $this->search_model->search($query);


        }
    }
于 2013-06-29T16:16:23.557 回答
0

直接在ajax请求中调用视图不是一个好习惯,调用加载视图的控制器或直接在控制器的函数中执行操作

<script type='text/javascript'>
    $('#search_bar').keyup(function(){
        $.ajax({
                url: 'yourcontrollername/search_bar_yourfunction',
                type:'POST',
                data: {q: search,
                success: function(result){
                 $("#livesearch").html(result);
                 $("#livesearch").slideDown("fast");
                    } 
                }); 
    });
    </script>

您的控制器代码

 class yourcontrollername extends My_Controller {
public function search_bar_yourfunction() {
      //do your stuff and store in the $data[] array

$this->load->view("search_bar",$data); //search_bar.php
die();
        }
    }
    }
于 2013-06-29T17:45:05.277 回答
0

我找到了一种在 CodeIgniter 3 中加载 ajax (jquery) 的方法。例如,

文件夹结构:

  1. 控制器/Upload.php
  2. 查看/admin/ajax_view/ajax_images.php

控制器/上传:

public function process()
{
    $data['my_picture'] = array(
        'pic_id' => '1', 
        'pic_path' => 'http://example.com/images', 
        );

    $this->load->view('admin/ajax_view/ajax_images', $data);
}

查看/管理/ajax_view/ajax_images:

<?php foreach($my_picture as $key => $row): ?>
<td><?php echo $my_picture['pic_path']; ?></td>
<?php endforeach; ?>

查看/管理/form_upload:

<tbody>
  <tr class="trbody">
    <th scope="row">1</th>
    <!-- <td></td> --> <!--comments this because appends element jquery-->
  </tr>
 </tbody>

<script type="text/javascript">
 $(document).ready(function(){
  $('#my_button').click(function(e){
   e.preventDefault;
    $.ajax({
      url: 'upload/process',
      dataType: 'text',
      type: 'post',
      success: function(data){
      $('.trbody')
      .append(
        '<td>'+ data + '</td>'
        );
      },
      error: function(errorThrown){
        console.log(errorThrown);
      }
    });
  });
});
</script>

这样,我分离了整个页面的ajax视图并在事件触发时加载ajax视图。

于 2015-07-18T15:38:24.487 回答