我有以下聚合物元素:
<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响应中收到的数据。
答案 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
属性上设置响应。我还将密钥reflectToAttribute
和notify
设置为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>