代码之家  ›  专栏  ›  技术社区  ›  GeoSal

在下拉列表中选择值后,Div不会更新

  •  2
  • GeoSal  · 技术社区  · 7 年前

    问题是当我点击一个城市时,不会显示图表,如果我更改选择,也不会更新图表,而且我似乎无法解决问题。

    我的代码如下:

    控制器/城市统计控制器。rb:

    def city_stats
      @state = params[:state]
      @cities = City.where(:state => @state).select(:id, :display_name).uniq.order('display_name ASC')
      # @city_id = City.select('id').where(:state => params[:city_state]).where(:name => params[:city_name])
      @city_id = City.select('id').find_by_id(params[:city])
    
      dynamic_query = ActiveRecord::Base.send(:sanitize_sql_array, ['SELECT COALESCE(name) as name, count(*) FROM (SELECT name, regs.segment_id, count(*) FROM regs
        INNER JOIN segments ON regs.segment_id = segments.id
        WHERE regs.city_id = ?
        GROUP BY segment_id, name
        ORDER BY count(*) DESC) as tabe
        GROUP BY name;', @city_id])
    
      @spatial_ratio = ActiveRecord::Base.connection.select_all(dynamic_query)
    
      puts @city_id.inspect #I can see the value printed in the terminal
      puts @spatial_ratio.inspect #Same here, even after changing the selection
    
      respond_to do |format|
        format.json { render :json => @cities }
        format.js {
          render json: {
            html: render_to_string(
              partial: 'city_stats',
              locals: {
                city_id: @city_id,
                spatial_ratio: @spatial_ratio
              })
          }
        }
        format.html
      end
    end
    

    <div class="row">
        <label>State <span>:</span></label>
        <%= collection_select :city, :state, City.select(:state).uniq.order('state ASC'), :state, :state, {:prompt => 'Select a State'}, {id: 'city_state', multiple: false} %> 
        <label>City <span>:</span></label>
        <%= collection_select :city, :name, [], :name, :name, {:prompt => 'Select a City'}, {id: 'city_name', multiple: false} %>
    </div>
    <div id="cities">
     <!-- Here I render the cities list upon selecting a state-->
     <%= render :partial => 'city_stats', :object => @cities %>
    </div>
    
    <div id="stats">
    </div>
    
    <script type="text/javascript">
    
    $(document).ready(function() {
     $("#city_state").on('change', function(){
      $.ajax({
       url: "/admin/city_stats",
       type: "GET",
       data: {state: $(this).val()},
       success: function(data) {
        $("#city_name").children().remove();
        // Create options and append to the list
        var listitems = []; 
        $.each(data,function(key, value) { 
          listitems += '<option value="' + value.id + '">' + value.display_name + '</option>';    
        });  
        $("#city_name").append(listitems);
    
        //console.log(listitems);
    
        $("#city_name").on('click', function(){
        $.ajax({
          url: "/admin/city_stats",
          type: "GET",
          data: {city: $(this).val()},
          success: function(data) {
            var content = $("#city_name").val()
            console.log(content);
            $('#stats').replaceWith("<%= j render(partial: 'city_stats') %>");
            return content;
    
          }
        })
    
      })
      }
    })
    
    });
    });
    

    在部分中:views/city\u stats/\u city\u stats。html。erb:

    <%= pie_chart @spatial_ratio.rows %>
    

    N、 B:如果我手动用随机id替换控制器中动态查询中的城市id,当我刷新页面时会显示对应城市的图表,但我不知道为什么它不能动态工作

    2 回复  |  直到 7 年前
        1
  •  1
  •   krishnar    7 年前

    def city_stats
      ...
      ...
      respond_to do |format|
       format.json  { render :json => @cities } 
       format.js
      end
    end
    

    2.创建city_统计数据。js。带有以下代码的erb文件

    $("#stats").html("<%= escape_javascript(pie_chart @spatial_ratio.rows) %>");
    

    3.像这样更改你的城市点击事件

      $("#city_name").on('click', function(){
        $.ajax({
          url: "/admin/city_stats",
          type: "GET",
          data: {city: $(this).val()},
          success: function(data) {
          }
        })
      });
    

    这应该可以解决你的问题。如果有任何问题/疑问,请发表评论

        2
  •  1
  •   Maksim Kalmykov    7 年前
    @city_id = City.select('id').find_by_id(params[:city])
    

    这行没有返回数字。它返回仅加载一个字段(id)的模型实例。尝试将其更改为

    @city_id = City.select('id').find_by_id(params[:city]).id
    

    另外,正如我所看到的,在您的AJAX处理程序中 $("#city_name").on('click')

    <%= j render(partial: 'city_stats') %>
    

    city_id 是手动设置的),因此在每个AJAX请求中,如果不完全重新加载页面,则替换 $('#stats')

    $(“#stats”) ,您将无法在下一次访问它,除非完全重新呈现页面,因为它已从DOM中删除。参见参考( replaceWith ).

    .empty() 容器,然后 .append() 里面有新的图表。

    这个想法是,如果你想在不重新加载页面的情况下更新图表,你应该使用来自服务器的新数据。

    success: function(data) {
    

    在你的情况下,它将在 data

    format.js { 
      render json: { 
        html: render_to_string(
          partial: 'city_stats', 
          locals: { 
            city_id: @city_id,
            spatial_ratio: @spatial_ratio
        }) 
      }
    }
    

    因此,您应该在处理程序中使用这些数据。可能是这样的:

    success: function(data) {
        $('#stats').empty().append(data.html);
    }
    

    然而,我不确定在当前的实现中是否可以实现。我想每次您发出AJAX请求时,它都会以

    format.json  { render :json => @cities }
    

    所以你要么两个都还 @cities

    $("#city_name") 的内部更改处理程序 $("#city_state") ,因为 $(“#city_state”) $(“#city_name”) 单击,每次单击时,该处理程序将被执行与绑定次数相同的次数。您可以使用 .off