【问题标题】:javascript function receives an empty array on initial page loadjavascript函数在初始页面加载时接收一个空数组
【发布时间】:2015-08-05 04:07:57
【问题描述】:

我正在开发一个简单的 Rails 应用程序,该应用程序允许用户输入邮政编码来查找该地区的酒吧和餐馆列表。

登录页面有一个邮政编码的表单字段。提交邮政编码后,应用会返回位置列表并使用 Google 的 api 呈现带有图钉的地图。

这是我的 javascript,目前位于 layouts/application.html.erb:

function initialize() {
  var pins = <%= raw @pins.as_json -%>;

    var map = new google.maps.Map(document.getElementById('map-canvas'), {
      zoom: 12,
      center: new google.maps.LatLng(pins[0][1], pins[0][2]),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var marker, i;

    for (i = 0; i < pins.length; i++) {
      marker = new google.maps.Marker({
        position: new google.maps.LatLng(pins[i][1], pins[i][2]),
        map: map,
        title:pins[i][0]
      });
    };
  }

这是我的来自 locations_controller.rb 的控制器

def index
  @locations = Location.all
  @results = @locations.where(params[:zip])
  @pins = @results.map{|r| [r.name, r['latitude'], r['longitude']]}
end

所有这些都运行良好。但是,我还想在用户第一次登陆页面时根据他们当前的位置显示地图,所以我修改了控制器如下:

def index
  # @ip = request.ip
  @ip = "152.86.199.175" #set a default ip since I am working locally
  Geocoder.configure(:ip_lookup => :telize) #without this, my api request times out
  user_zip = Geocoder.search(@ip).first.data['postal_code']
  zip = params[:zip].present? ? params[:zip] : user_zip
  @locations = Location.all
  @results = @locations.where(:zip => zip)
  @pins = @results.map{|r| [r.name, r['latitude'], r['longitude']]}
end 

如果我在 Rails 控制台中运行修改后的代码,它就可以工作。我能够找到用户的 zip 并根据它生成一个 pin 列表。但是,它在应用程序中不起作用。 javascript 函数从控制器获取的引脚数组为空。

我已经尝试调试了几天。我最好的猜测是 javascript 在控制器运行之前运行,并且引脚数组尚未构建。我尝试将函数包装在 $( document ).ready() 和 $(document).on("pageload") 中,但都没有帮助。我还尝试在 javascript 中创建一个条件来检查是否有任何引脚,如果没有,则向控制器发出 ajax 请求。不幸的是,我最终收到了两个请求,但没有得到任何密码。

我对 javascript 时间的假设是否正确?谁能解释为什么javascript函数在一个实例中获得一组引脚,而在另一个实例中却没有?有人对这项工作有什么建议吗?

谢谢

【问题讨论】:

  • 您的地图在这两种情况下都正确构建了吗?销和无销。或者它不在第二类调用中创建地图?
  • 仅在通过表单提供 zip 时构建。当您最初登陆页面时,没有地图、图钉和位置列表。
  • 尝试添加一些只有 1 毫秒的 jquery 超时功能。这可能会解决您的问题
  • 在你的地图上初始化 js 方法..
  • 没用,但值得一试。谢谢

标签: javascript ruby-on-rails google-maps


【解决方案1】:

我刚刚检查了GeocoderGeocoder.search(@ip).first.data 的结果没有['postal_code'] 键,而是有一个您可以使用的['zip_code'] 键,也许这就是问题所在

【讨论】:

  • 有趣。我有 zip_code,然后在检查结果后对其进行了更改。也许 telize 配置会改变结果。这是我使用 'puts Geocoder.search(@ip).first.data' - {"longitude"=>-122.6298, "latitude"=>45.6447, "asn"=>"AS209", "offset"=> "-7", "ip"=>"71.222.81.174", "area_code"=>"0", "continent_code"=>"NA", "dma_code"=>"0", "city"=>"温哥华", "timezone"=>"America/Los_Angeles", "region"=>"Washington", "country_code"=>"US", "isp"=>"Qwest Communications Company, LLC", "postal_code"=>" 98661", "country"=>"United States", "country_code3"=>"USA", "region_code"=>"WA"}
【解决方案2】:

好的,代码正在运行。地理编码器返回的是附近的邮编,而不是确切的邮编。该 zip 的数据库中没有相应的条目。这就是为什么我得到一个空数组。尴尬。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多