Polymer Can';t将用户位置传递给ajax调用,以从Foursquare获取场地

Polymer Can';t将用户位置传递给ajax调用,以从Foursquare获取场地,polymer,Polymer,我正在用Polymer、谷歌地图和Foursquare API制作一个应用程序,但我被卡住了。这个想法是向用户展示附近的场地,这些场地是从Foursquare返回的。我正在使用从Foursquare获取场地 我已经创建了一个自定义元素,我正在使用geolocation获取用户的位置,并尝试将其传递给。当我手动传递纬度和经度时,AJAX调用非常有效,但是当我尝试将值更改为geolocation值时,AJAX调用中断 模板: <template> <geo-location w

我正在用Polymer、谷歌地图和Foursquare API制作一个应用程序,但我被卡住了。这个想法是向用户展示附近的场地,这些场地是从Foursquare返回的。我正在使用
从Foursquare获取场地

我已经创建了一个自定义元素,我正在使用
geolocation
获取用户的位置,并尝试将其传递给
。当我手动传递纬度和经度时,AJAX调用非常有效,但是当我尝试将值更改为
geolocation
值时,AJAX调用中断

模板:

<template>
  <geo-location watch-pos latitude="{{ latitude }}" longitude="{{ longitude }}"></geo-location>
  <google-map latitude="[[latitude]]" longitude="[[longitude]]" zoom="13" api-key="AIzaSyCZ52mvUoJplSOmOFE2KW0u5v6jny870IM">
  <!--  <google-map-marker latitude="[[latitude]]" longitude="[[longitude]]" draggable="true"></google-map-marker>-->
  </google-map>

  <iron-ajax
    auto
    url="https://api.foursquare.com/v2/venues/search?"
    params="{{ajaxParams}}"
    last-response="{{data}}"
    handle-as="json"
    >
    </iron-ajax>
  <template is="dom-repeat" items="[[data.response.venues]]">
    <span>{{item.name}}</span>

  </template>
<script>
Polymer({
  is: 'my-list',

  properties: {
        client_id: {
            type: String,
            value: 'THIS IS MY CLIENT_ID'
        },
        client_secret: {
            type: String,
            value: 'THIS IS MY CLIENT_SECRET'
        },
        v: {
            type: Number,
            value: '20150729'
        },
        limit: {
            type: Number,
            value: '10'
        },
        ll: {
            type: String,
            value:
              getCurrentLat(function(pos){
                console.log(pos);
              })
        },
        ajaxParams: {
            type: String,
            computed: 'processParams(client_id, client_secret, v, limit, ll)'
        }
    },

    processParams: function(client_id, client_secret, v, limit, ll) {
        return {
        client_id: client_id,
        client_secret: client_secret,
        v: v,
        limit:limit,
        ll: ll
      };
    }
});

function getCurrentLat(callback) {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
        callback(position.coords.latitude + ", " + position.coords.longitude);
    });
  } else {
    console.log("Unable to access your geolocation");
  }
}
ll: {
    type: String,
    value:
         getCurrentLat(function(pos){
            console.log(pos);
         })
},

例如,每当我将
ll
值设置为
'60,25'
时,AJAX调用都会返回正确的结果。此外,上面的
console.log
正确地打印了用户的位置(类似于
60、24
),但我不知道如何将
pos
设置为值。

首先,您的
ll
属性声明有一个无效的
字段,该字段用于提供初始值。它不打算像您正在尝试的那样设置回调。最初,您可能应该将该字段留空:

Polymer({
  ...
  properties: {
    ll: String
  }
});
ll
的值可以在JavaScript中强制设置(即
this.ll=position;
),也可以在标记中通过数据绑定声明设置(即
)。由于
ll
值需要从
navigator.geolocation.getCurrentPosition
异步来,我们可以从聚合物元素的生命周期回调调用它(例如,
attached
),然后在
geolocation
回调中强制设置
ll

Polymer({
  ...
  attached: function() {
    getCurrentLat(function(position) {
      this.ll = position;
    }.bind(this));
  }
});

但看起来您也在使用元素,它已经为您读取当前纬度/经度并提供实时更新,因此您实际上不需要自己使用
navigator.geolocation
(在您的情况下是一次性更新)

代替上述更改,您可以修改
ajaxParams
计算属性,使其基于现有的
纬度
经度
属性(由
填充):

这也将允许您摆脱
getCurrentLat()

请注意,自Chrome 50起,地理定位API为。如果您尝试从
http
而不是
https
使用它,您会注意到控制台警告:


首先,您的
ll
属性声明有一个无效的
字段,用于提供初始值。它不打算像您正在尝试的那样设置回调。最初,您可能应该将该字段留空:

Polymer({
  ...
  properties: {
    ll: String
  }
});
ll
的值可以在JavaScript中强制设置(即
this.ll=position;
),也可以在标记中通过数据绑定声明设置(即
)。由于
ll
值需要从
navigator.geolocation.getCurrentPosition
异步来,我们可以从聚合物元素的生命周期回调调用它(例如,
attached
),然后在
geolocation
回调中强制设置
ll

Polymer({
  ...
  attached: function() {
    getCurrentLat(function(position) {
      this.ll = position;
    }.bind(this));
  }
});

但看起来您也在使用元素,它已经为您读取当前纬度/经度并提供实时更新,因此您实际上不需要自己使用
navigator.geolocation
(在您的情况下是一次性更新)

代替上述更改,您可以修改
ajaxParams
计算属性,使其基于现有的
纬度
经度
属性(由
填充):

这也将允许您摆脱
getCurrentLat()

请注意,自Chrome 50起,地理定位API为。如果您尝试从
http
而不是
https
使用它,您会注意到控制台警告:


谢谢你的回答!你建议的两种方法我都试过了,但还是不管用。。我认为更好的方法是使用
,但当我尝试时,
纬度
经度
都是
空的
。我不知道如何将这些值从
获取到
ajaxParams
。我包含的代码笔对我有效,因此问题一定是特定于您的环境或您测试它的方式。你在https上测试这个吗?当提示您输入地理定位权限时,您是否单击了“允许”?地理定位是允许的,我不会在https上测试它。我真的不知道问题出在哪里。这就是为什么我没有使用
就尝试了这个方法。虽然我没有让它使用
getCurrentLat()
但是地理位置API只能从https获得(您应该在控制台中看到一个声明,如更新的答案所示)。它正在工作!我现在觉得自己很愚蠢。。我没有注意到在
Polymer()
之前添加
HTMLImports()
。。。。非常感谢你!现在我的场地离我的位置很近。谢谢你的回答!你建议的两种方法我都试过了,但还是不管用。。我认为更好的方法是使用
,但当我尝试时,
纬度
经度
都是
空的
。我不知道如何将这些值从
获取到
ajaxParams
。我包含的代码笔对我有效,因此问题一定是特定于您的环境或您测试它的方式。你在https上测试这个吗?当提示您输入地理定位权限时,您是否单击了“允许”?地理定位是允许的,我不会在https上测试它。我真的不知道问题出在哪里。这就是为什么我没有使用
就尝试了这个方法。虽然我没有让它使用
getCurrentLat()
但是地理位置API只能从https获得(您应该在控制台中看到一个声明,如更新的答案所示)。它在