2016-10-03 71 views
0

我正在尝试开发一个组件,它可以将不同数量的AJAX请求发送到不同的URL。以下是它的作用:在Polymer中动态生成AJAX请求

  1. 发出初始请求以获取用户所属的组。

  2. 当初始请求完成时,请为每个返回的组发出请求。该请求的URL包含在对初始请求的响应中返回的组ID。

  3. 随着每个组请求的完成,以及组数据到一个数组属性。

  4. 当所有组请求都完成时,请设置一个布尔属性,以便“加载”指示器隐藏。

这对于jQuery来说很简单。您只需在步骤2中为每个组调用$ .ajax。对于步骤4,您将由$ .ajax调用返回的所有Deferred对象传递给$ .whenAll。

很明显,如何用iron-ajax做第1步。我正在寻找一个如何完成聚合物中第2步和第4步的例子。我所见过的所有iron-ajax示例都会对URL进行硬编码的服务执行一次ajax请求。你如何做一个可变数量的请求,其中的URL是在运行时确定的?

感谢, 丹尼斯

回答

1

首先,我会鼓励这条道路,你不仅限于声明方式与聚合物的工作。您可以使用fetch API和Promises轻松编写类似于$ .ajax的代码。基本上有window.fetch而不是$.ajaxPromise.all而不是$.whenAll

MDN声称它尚未标准化,但polyfill实现提供了一个稳定的解决方案。

如果您确实想要使用iron-ajax,您可以将其与动态值绑定并在dom-repeat内迭代结果。

<iron-ajax url="[[groupsUrl]]" 
      auto 
      handle-as="json" 
      last-response="{{userGroups}}"></iron-ajax> 

<template is="dom-repeat" items="[[userGroups]] as="group"> 
    <iron-ajax url="/api/base/url/{{group.id}}" 
      auto 
      on-response="handleGroup"></iron-ajax> 
</template> 

最后,在handleGroup函数中可以填充数组属性。设置布尔加载标志将是icky虽然。您告诉所有请求已完成的唯一方法是计算事件处理程序触发多少次。 Promise.all在这方面肯定是比较干净的。

+0

最后,作为一般建议,不要只在您的回复中发送该ID到第一个电话。如果服务器包含完整的URL,您的生活将变得更加轻松。 –