Ajax 从Polymer 1.0中的子元素(或深子元素)访问根基API URL

Ajax 从Polymer 1.0中的子元素(或深子元素)访问根基API URL,ajax,polymer-1.0,Ajax,Polymer 1.0,我在Polymer 1.0环境中创建了许多元素。有些元素是基于我使用iron ajax从数据库服务器获得的数据的列表。目前,我正在使用我的根应用程序将API URL作为元素属性传递给需要它的每个元素(或子元素),以便它可以进行调用并显示结果 不过,这种做法让人感觉有些不对劲。我应该将AJAX URL从根元素传递到需要它的子元素,还是子元素有办法知道全局设置的应用程序API URL是什么?幸运的是,我也遇到了同样的问题 其中有一个元素:) 因此,我创建了一个自定义元素来包装应用程序中的所有iron

我在Polymer 1.0环境中创建了许多元素。有些元素是基于我使用iron ajax从数据库服务器获得的数据的列表。目前,我正在使用我的根应用程序将API URL作为元素属性传递给需要它的每个元素(或子元素),以便它可以进行调用并显示结果


不过,这种做法让人感觉有些不对劲。我应该将AJAX URL从根元素传递到需要它的子元素,还是子元素有办法知道全局设置的应用程序API URL是什么?

幸运的是,我也遇到了同样的问题

其中有一个元素:)

因此,我创建了一个自定义元素来包装应用程序中的所有
ironajax
元素,称之为
myappapi

这个
myappapi
元素负责更新嵌套的
ironajax
url属性

<dom-module id="my-app-api">
  <style>
    :host {
      display: none;
    }
  </style>
  <template>
    <content select="iron-ajax"></content>
  </template>
</dom-module>
<script>
(function() {
  Polymer({
    is: 'my-app-api',

    properties: {
      baseUrl: {
        type: String,
        value: 'http://localhost:9000'
      }
    },
    attached: function() {
      this.updateUrlsAndSign();
    },
    updateUrlsAndSign: function() {

      var ajaxElements = Polymer.dom(this).querySelectorAll('iron-ajax');

      var ajaxElementsArray = [].slice.call(ajaxElements);

      ajaxElementsArray.forEach(function(ajax) {

        var urlAttr = ajax.getAttribute('url');

        if ( !urlAttr ) { return; }

        ajax.url = this.baseUrl + urlAttr.replace(window.location.origin, '');

        ajax.headers = ajax.headers || {};

        ajax.headers['Content-Type'] = 'application/json';

        ...

      }.bind(this));
    }
  });
})();
</script>

:主持人{
显示:无;
}
(功能(){
聚合物({
是:“我的应用程序api”,
特性:{
基本URL:{
类型:字符串,
值:'http://localhost:9000'
}
},
附:函数(){
this.updateUrlsAndSign();
},
updateUrlsAndSign:function(){
var ajaxElements=Polymer.dom(this.queryselectoral('iron-ajax');
var ajaxementsarray=[].slice.call(ajaxements);
forEach(函数(ajax){
var urlAttr=ajax.getAttribute('url');
如果(!urlatr){return;}
ajax.url=this.baseUrl+urlatr.replace(window.location.origin“”);
ajax.headers=ajax.headers | |{};
headers['Content-Type']='application/json';
...
}.约束(这个);
}
});
})();
示例用法

<my-app-api>
<iron-ajax
    url="/api/videos/"
    params="{{requestParams}}"
    handle-as="json"
    on-response="handleResponse"></iron-ajax>
</my-app-api>

我没有在
ironajax
元素上设置
auto
属性来测试它

在我的例子中,这不是一个问题,所以上面的代码对我来说很好


希望这将帮助您实现更好的解决方案。

我做了类似的事情(在API元素中包装iron),但我不喜欢在元素中硬编码我的基本API URL。如果元素与使用不同端口的人共享,该怎么办?如果我将端口作为一个参数传递给我的包装器,那么我将端口Parma传递给每个元素和子包装器-这似乎也不正确…还有一个问题,@Mohammad:如何处理请求头的会话令牌和用户ID更新?您是否每次都将它们传递到iron ajax元素中?@Sean当然,这就是
updateUrlsAndSign()
函数的其余部分