2016-06-03 19 views
1

Ist es ein beabsichtigtes Verhalten von Polymer, dass BeforeRegister() -Methode auf einer Ebene HTMLElement ausgeführt wird? Dies führt zu einem Fehler bei der Verwendung einer Pfeilfunktion in der Eigenschaftsdeklaration innerhalb eines berechneten Eigenschaftswerts. Es löst nicht auf, weil this eine native HTMLElement ist, während das Objekt, auf das die Funktion aufgerufen wird, das erweiterte Polymerelement zur Laufzeit ist (was funktioniert, wenn eine normale Funktion verwendet wird)?`this` Schlüsselwort löst in HTMLElement in Polymer in BeforeRegister-Methode

funktioniert das nicht:

class TestComponent { 
    beforeRegister() { 
     /* during beforeRegister() execution `this` is a `HTMLElement`*/ 
     this.is = 'test-component'; 
     this.properties = { 
     _testElement: { 
      type: Object, 
      value:() => this.$.testElement 
     } 
     }; 
    } 
    } 

Dies funktioniert:

class TestComponent { 
    beforeRegister() { 
     this.is = 'test-component'; 
     this.properties = { 
     _testElement: { 
      type: Object, 
      value: function() { 
      /* `this` is an instance of TestComponent */ 
      return this.$.testElement 
      } 
     } 
     }; 
    } 
    } 

Es ist kein großes Problem, aber ich frage mich, ob es ein Problem gegenüber ES6 Unterstützung in Polymer ist und wird behoben oder ob es ein beabsichtigtes Verhalten ist.

+0

Die babel transpilation ist richtig. Das 'This' in der Pfeilfunktion ist dasselbe' This' wie in 'BeforeRegister', oder? – Bergi

+0

Es sollte eine Instanz von 'TestComponent' sein. Das Problem ist, dass, während beforeRegister() ausgeführt wird, 'this' eine Instanz von' HTMLElement' ist. Vielleicht ist Polymer hier die Ursache des Problems. Dies könnte ein Problem sein, da andere vor allem bei der Verwendung von Polymer mit es6-Klassen gleich aussehen werden. Also würde ich es lieber als Duplikat markieren. – SeDav

+1

Sicher, Polymer könnte hier seltsame Dinge tun, indem er 'beforeRegister' auf einem' HTMLElement' anstelle der 'TestComponent' Instanz aufruft, aber die Pfeilfunktion funktioniert wie erwartet. – Bergi

Antwort

0

Statt beforeRegister() der Verwendung is und properties zur Klasse hinzuzufügen, können Sie Getter erklären, die Sie für Objektwerte verwenden, um die ES6 Syntax erlauben würde:

class TestComponent { 
    get is() { return 'test-component' } 

    get properties() { 
    return { 
     _testElement: { 
     type: Object, 
     value:() => this.$.testElement 
     } 
    } 
    } 

    ready() { 
    console.log('ready', this._testElement); 
    } 
} 

Polymer(TestComponent); 

codepen

Verwandte Themen