Polymer web app element null pointer exception

ぐ巨炮叔叔 提交于 2019-12-20 06:01:22

问题


I am user iron-list with iron-ajax but after ajax response when pushing element to iron-list giving null exception = "Cannot read property '_list' of undefined"

<script>

    Polymer({
        is: 'my-home',

        ready: function () {
            this.$._ajax.generateRequest();
        },

        onResponse: function (e) {

            var people = e.detail.response.data;
            people.forEach(function (person) {
                this.$._list.push('items', person);
            });
            // Clear the lower threshold so we can load more data when the user scrolls down again.
            this._scrollTheshold.clearTriggers();
        }

    });

</script>

here is my html code of iron-list

 <iron-list id="_list" items="[[data.data]]" as="item">
        <template>

            <div style="margin-top: 0px">

                <!--Card with header image http://placehold.it/350x150/FFC107/000000-->
                <paper-card>

                    <div class="card-content">
                        <h1 class="feed_title">[[item.heading]]</h1>

                        <p class="feed_description">[[item.subheading]]</p>
                    </div>
                    <div class="card-actions">
                        <paper-button class="button-blue">
                            Share
                        </paper-button>
                        <paper-button class="button-blue">
                            Explore
                        </paper-button>
                    </div>
                </paper-card>
            </div>
        </template>
    </iron-list>

回答1:


Adding to @tony19's answer you can also achieve this with bind

people.forEach(function (person) {
  this.$._list.push('items', person);
}.bind(this));



回答2:


In your forEach() function expression, this refers to the Window object, and not the Polymer object. (If using "use strict" here, this would be undefined, but it seems that's not the case for you.)

A few options to fix this:

  • Option 1: Use ES6 arrow function, which does not bind its own this (assuming ES6 is available for you):

    onResponse: function (e) {
      var people = e.detail.response.data;
      people.forEach(person => {
        this.$._list.push('items', person);
      });
      ...
    }
    
  • Option 2: Use ES6 for-of loop, removing need for callback (assuming ES6 is available for you):

    onResponse: function (e) {
      var people = e.detail.response.data;
      for (const person of people) {
        this.$._list.push('items', person);
      });
      ...
    }
    
  • Option 3: Use ES6 spread operator to push all array items at once (assuming ES6 is available for you):

    onResponse: function (e) {
      var people = e.detail.response.data;
      this.$._list.push('items', ...people);
      ...
    }
    
  • Option 4: Pass in a reference to the Polymer object:

    onResponse: function (e) {
      var self = this;
      var people = e.detail.response.data;
      people.forEach(function (person) {
        self.$._list.push('items', person);
      });
      ...
    }
    
  • Option 5: Pass in a reference to the list object:

    onResponse: function (e) {
      var list = this.$._list;
      var people = e.detail.response.data;
      people.forEach(function (person) {
        list.push('items', person);
      });
      ...
    }
    
  • Option 6: Explicitly bind this in your function expression:

    onResponse: function (e) {
      var people = e.detail.response.data;
      people.forEach(function (person) {
        this.$._list.push('items', person);
      }.bind(this));
      ...
    }
    
  • Option 7: Pass this as second parameter of forEach():

    onResponse: function (e) {
      var people = e.detail.response.data;
      people.forEach(function (person) {
        this.$._list.push('items', person);
      }, this);
      ...
    }
    


来源:https://stackoverflow.com/questions/39816272/polymer-web-app-element-null-pointer-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!