2014-12-04 481 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