2016-07-28 29 views
2

Ich verwende Polymer 1.5 und ich brauche wirklich die "this" -Variable, die nicht außerhalb abgebildet werden soll. Ich weiß, Typoskript tut dies für einige valid reasons.Verhindern, dass "dies" umgeschrieben wird Typskript-Kompilierung

declare var Polymer: any; 
var MyBehavior = MyBehavior || {}; 

MyBehavior.FormSubmit = { 
    _setInvalid: (query, status) => { 
     var elems = Array.prototype.slice.call(Polymer.dom(this.root).querySelectorAll(query)); 
     elems.forEach(element => { 
      if (status) { 
       element.setAttribute('invalid', status); 
      } 
      else { 
       element.removeAttribute('invalid'); 
      } 
     }); 
    } 
}; 

erhalten dann abgebildet auf:

$this = this; 
var MyBehavior = MyBehavior || {}; 

MyBehavior.FormSubmit = { 
    _setInvalid: (query, status) => { 
     var elems = Array.prototype.slice.call(Polymer.dom($this.root).querySelectorAll(query)); 
     elems.forEach(element => { 
      if (status) { 
       element.setAttribute('invalid', status); 
      } 
      else { 
       element.removeAttribute('invalid'); 
      } 
     }); 
    } 
}; 

über die Variable die das sehen? Dies wird den Code brechen. Wenn ich auf die "This.root" oder Ähnliches zugreifen könnte, wird das Wunder bewirken. Gibt es eine Möglichkeit zu verhindern, dass TypeScript das "Dies" verschiebt?

S.S: Ich wusste nur über PolymerTS! Leider kann ich es nicht dazu bringen, Verhalten vom Polymer-Objekt aufzurufen.

+1

Sogar in Javascript, das Pfeilfunktionen (=>) unterstützt, funktioniert 'this', als wäre es erfasst worden. Wenn Sie Old-School-'this' Verhalten wollen, müssen Sie Old-School-Funktionen verwenden. – recursive

Antwort

4

Hinweis, ich bin ein Pfeil Funktion nicht verwenden, sondern eine reguläre Funktion

MyBehavior.FormSubmit = { 
    _setInvalid: function(query, status) { 
     var elems = Array.prototype.slice.call(Polymer.dom(this.root).querySelectorAll(query)); 
     elems.forEach(element => { 
      if (status) { 
       element.setAttribute('invalid', status); 
      } 
      else { 
       element.removeAttribute('invalid'); 
      } 
     }); 
    } 
}; 

Eine der Möglichkeiten, ein Pfeil Funktion von der regulären Funktion Syntax unterscheidet, ist, dass das Innere eines Pfeils Funktion dieses Schlüsselwort ist gebunden an die Klasse/das Objekt.

Um sicherzustellen, dass die Bedeutung von „this“ wird sich nicht ändern, wenn ein Pfeil-Funktion (ECMAScript 6) zu ECMAScript 5 der Compiler verwendet die

var _this = this; 

Trick Typoskript übersetzen, die ein altes JavaScript Muster ist.

+0

bam bam bam! Das war's! Vielen Dank! Beeindruckend. Ich wusste nicht, dass die Pfeilfunktion an die Klasse/das Objekt gebunden ist. Ich habe immer gedacht, dass es eine Zuckersyntax-Kurzschrift für Funktion() war. Das erklärt, warum es den ganzen Weg dorthin hochkarätiert hat !!! –