【问题标题】:Binding iron-ajax data to a template将 iron-ajax 数据绑定到模板
【发布时间】:2015-07-13 18:51:56
【问题描述】:

我有一个 Polymer (1.0) 应用程序,它从 AJAX 加载 books 列表:

book-service/book-service.html:

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

<dom-module id="book-service">
    <style>

    </style>

    <template>
        <iron-ajax
          auto
          url="https://example.com/books.json"
          handle-as="json"
          on-response="booksLoaded"></iron-ajax>
    </template>

    <script>
    Polymer({
        is: 'book-service',

        properties: {
            books: { type: Array }
        },

        created: function(){
            this.books = [];
        },

        booksLoaded: function(request){
            this.books = request.detail.response
        }
    });
    </script>
</dom-module>

components/book-list.html:

<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="../book-service/book-service.html">

<dom-module id="book-list">
    <style>

    </style>

    <template>
        <book-service id="service" books="{{books}}"></book-service>

        <div>
            <div>Books:</div>
            <ul>
            <template is="dom-repeat" items="{{books}}">
                <li>{{item.title}}</li>
            </template>
            </ul>
        </div>
    </template>

    <script>
    Polymer({is: 'book-list'});
    </script>
</dom-module>

虽然我可以确认 AJAX 请求正在接收 JSON,但 DOM 中没有任何变化。然后我注意到 Polymer 1 数据绑定指南中的注释,即突变需要使用 Polymer 方法,所以我尝试了显示的内容,响应处理程序变成了这样:

booksLoaded: function(request){
    this.push('books', request.detail.response);
}

但现在我得到一个错误! Uncaught TypeError: Cannot read property 'concat' of undefined

我如何实际将 AJAX 响应绑定到模板?

【问题讨论】:

    标签: ajax data-binding polymer


    【解决方案1】:

    使用notify 属性将属性更改向上传播以进行绑定。

    properties: {
        books: { type: Array, notify: true }
    },
    

    此外,您还可以通过以下方式减少 booksLoadedcreated 函数:

    <dom-module id="book-service">
        <template>
            <iron-ajax
              auto
              url="https://example.com/books.json"
              handle-as="json"
              last-response="{{books}}"></iron-ajax>
        </template>
    
        <script>
        Polymer({
            is: 'book-service',
            properties: {
                books: {
                  type: Array,
                  notify: true,
                  value: function(){return []}
                }
            }
        });
        </script>
    </dom-module>
    

    【讨论】:

    • 好的开始,但这仍然不能解决使用this.push(…)引起的错误:/
    • 我认为它无法初始化数组,您应该在ready 中初始化books 属性值,或者在我上面的编辑中初始化为value 函数。
    • 这终于成功了,但我不得不恢复到this.books = … 语法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多