使用聚合物ajax响应

时间:2015-06-02 08:49:16

标签: javascript ajax polymer

我有以下聚合物元素:

<link rel="import" href="../bower_components/iron-ajax/iron-ajax.html">

<dom-module id="task-list-app">
    <style>
        :host {

        }
    </style>
    <template>
        <iron-ajax auto url="../tasks.json" handle-as="json" on-response="handleResponse"></iron-ajax>
        <template is="dom-repeater" items="{{todos}}">
            <span>hello</span>
        </template>
    </template>
</dom-module>

<script>
    Polymer({
        is: "task-list-app",
        created: function () {
            this.todos = [];
        },

        handleResponse: function (data) {
            this.todos = data.detail.response;
        }
    });
</script>

我在index.html中调用了这个:

<task-list-app></task-list-app>

我希望对于todo数组中返回的每个对象,都会打印<span>。但是,当我运行应用程序时,我在控制台中获得以下输出:

  

未捕获的TypeError:无法读取未定义的属性'todos'

polymer.html line 1001

中的

我不确定这里发生了什么以及如何引用从ajax响应中收到的数据。

3 个答案:

答案 0 :(得分:12)

首先,您用来遍历数据的第二个模板应该是“ dom-repeat ”,而不是“ dom-repeater ”。其次,您可以直接将iron-ajax的响应绑定到循环模板。像这样,

<link rel="import" href="../bower_components/iron-ajax/iron-ajax.html">

<dom-module id="task-list-app">
    <style>
        :host {

        }
    </style>
    <template>
        <iron-ajax auto url="../tasks.json" handle-as="json" last-response="{{ajaxResponse}}"></iron-ajax>
        <template is="dom-repeat" items="[[ajaxResponse.todos]]">
            <span>{{item.todoItem}}</span>
        </template>
    </template>
</dom-module>

<script>
    Polymer({
        is: "task-list-app"
    });
</script>

因此,您基本上将 last-response 属性的值绑定到循环模板。

答案 1 :(得分:6)

将我的头撞在墙上几个小时后,我设法解决了这个问题。我创建了自己的名为ajax-service的元素,它有一个名为todos的公共属性Array。在这个元素中,我使用iron-ajax元素来执行ajax调用。

当ajax完成时,将调用一个函数并在todos属性上设置响应。我还将密钥reflectToAttributenotify设置为true。这意味着todos属性的值会反映回主机节点上的属性,并且可用于双向绑定(有关详细信息,请参阅here)。

我的task-list-app元素如下:

<link rel="import" href="ajax-service.html">
<link rel="import" href="task-item.html">
<link rel="import" href="tiny-badge.html">

<dom-module id="task-list-app">
    <style>
        :host {

        }
    </style>
    <template>
        <ajax-service todos="{{todos}}"></ajax-service>
        <template is="dom-repeat" items="{{todos}}">
            <task-item task="{{item}}"></task-item>
        </template>
        <div>
            <tiny-badge>[[todos.length]]</tiny-badge> total tasks
        </div>
    </template>
</dom-module>

<script>
    Polymer({
        is: "task-list-app"
    });
</script>

和我的ajax-service元素:

<link rel="import" href="../bower_components/iron-ajax/iron-ajax.html">

<dom-module id="ajax-service">
    <style>
        :host {

        }
    </style>
    <template>
        <iron-ajax auto url="../tasks.json" handle-as="json" on-response="tasksLoaded"></iron-ajax>
    </template>
</dom-module>

<script>
    Polymer({
        is: "ajax-service",
        properties: {
            todos: {
                type: Array,
                reflectToAttribute: true,
                notify: true
            }
        },
        attached: function () {
            this.todos = [];
        },
        tasksLoaded: function (data) {
            this.todos = data.detail.response;
        }
    });
</script>

这样做意味着我可以在on-response函数中编辑数据,然后再在元素上进行设置。

答案 2 :(得分:5)

在脚本中使用之前,您需要定义属性:

<script>
  Polymer({
    is: "task-list-app",
    properties: {
      todos: {
        type: Array,
        notify: true
      }
    },

    handleResponse: function (data) {
      this.todos = data.detail.response;
    }
  });
</script>