2014-12-04 1 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, если он считается правильным –

ответ

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 произошла. –

+0

https://github.com/GoogleWebComponents/google-youtube-video-wall/blob/master/google-youtube-video-wall.html#L524 может иметь отношение к вашей ситуации - это пример использования 'JSON.stringify() 'для создания входной строки до' '. Вам нужно немного адаптировать его для работы с вложенными объектами, но общий подход должен работать. –

Смежные вопросы