2014-12-04 248 views
0

将当前对象传递给回调函数的最佳方式是什么?将当前聚合物对象(this)传递给回调函数

我一直在使用类似:

var that = this; 

例如:

<link rel="import" href="/bower_components/polymer/polymer.html"> 
<polymer-element name="stackx-example"> 
    <template> 
     <div id="container">{{innards}}</div> 
    </template> 
    <script> 
     Polymer('stackx-example', { 
      ready: function() { 
       var jax = new XMLHttpRequest(); 
       jax.open('GET', '/jaxson/testing/', true); 
       jax.send(); 
       var that = this; 
       jax.onreadystatechange = function(){ 
       if (jax.readyState == 4 && jax.status == 200) { 
        that.innards = jax.responseText; 
       } 
      } 
      }, 
      innards: '..missing' 
     }); 
    </script> 
</polymer-element> 
+0

我一直在做同样的事情。 IDK,如果它被认为是正确的 – 2014-12-04 18:18:57

回答

1

您可以使用Function.prototype.bind()回调中this值设置为外界所使用的相同this值回拨:

jax.onreadystatechange = function() { 
    if (jax.readyState == 4 && jax.status == 200) { 
    this.innards = jax.responseText; 
    } 
}.bind(this); 

作为一个切线位,这是使用<core-ajax>而不是普通的XMLHttpRequest的好机会。它会导致更惯用的聚合物代码:

<polymer-element name="stackx-example"> 
    <template> 
     <div id="container">{{innards}}</div> 

     <core-ajax auto 
       url="/jaxson/testing/" 
       handleAs="text" 
       response="{{innards}}"> 
     </core-ajax> 
    </template> 

    <script> 
     Polymer({ 
     innards: '..missing' 
     }); 
    </script> 
</polymer-element> 
+0

谢谢杰夫!我将开始使用'.bind',因为这会清除一些代码。我正在使用_core-ajax_来处理其他事情(所以**很好,简单!**),但它不是json编码多层次的对象,所以发生了jax函数。 – 2014-12-04 23:08:14

+0

https://github.com/GoogleWebComponents/google-youtube-video-wall/blob/master/google-youtube-video-wall.html#L524可能与您的情况有关 - 这是使用“JSON.stringify”的示例()'产生输入字符串到''。你需要适应它来处理嵌套的对象,但一般的方法应该工作。 – 2014-12-05 00:21:34