2014-07-27 5 views
5

ich habe:Kann ich vermeiden, das Wort "this" in Typescript zu verwenden, wenn ich eine Funktion aufruft, die über einen Konstruktor kam?

class AdminHomeController { 

    private config1; // I tried different variations here but none worked 
    public config2; // 

    constructor(
       private $scope: IAdminHomeControllerScope 
       ) { 
        this.config = $scope.config; // << this works 
       } 

    static $inject = [ 
     '$scope' 
    ]; 

    configChanged = (clear) => { 
     this.config.clear(); 
    }; 

} 

Dieser Code funktioniert und this.config verfügt über alle Methoden, die ich brauche. Aber gibt es eine Möglichkeit , dass ich die Notwendigkeit für die this entfernen kann? Was ich möchte in der Lage sein zu tun, ist folgender zu Code:

configChanged = (clear) => { 
    config.clear(); 
}; 

Ich habe versucht, mit vielen verschiedenen Variationen, aber ich kann es nicht zu arbeiten.

Hier ist ein Beispiel aus dem gleichen Code vor dem Typoskript Wechsel:

angular.module('admin') 
    .controller('AdminHomeController', [ 
     '$http', 
     '$q', 
     '$scope', 
     'utilityService', 
     adminHomeController]); 

function adminHomeController(
    $http, 
    $q, 
    $scope, 
    utilityService 
    ) { 

    var app = $scope.app; 
    var config = app.config; 
    var home = this; 
    var util = utilityService; 

    home.autoSave = false; 
    home.data = {}; 
    home.entityType = null; 
    home.forms = { grid: null, modal: null }; 
    home.grid = { view: [], data: [] }; 
    home.modal = { visible: false }; 
    home.row = {}; 
    home.rowSelected = null; 

    home.configChanged = function (clear) { 
     config.put(); 
     if (clear) { 
      home.grid.backup = []; 
      home.grid.data = []; 
     } 
    }; 
+0

warum? . . ... . – djechlin

+1

Lange vorher, als ich nur Javascript verwendete, sah meine Lösung sauber aus. Jetzt hat die Lösung das Wort "this" vor fast jedem Funktionsaufruf. In einigen Fällen habe ich fast 100 Funktionsaufrufe auf diese Weise. –

+0

Wenn Sie 'this' löschen, wird Ihr Code in JavaScript eine andere Bedeutung haben. Dies ist nicht Java oder C# oder C++ ... –

Antwort

3

Wie djechilin sagte:

Wenn Sie „der“, weglassen der Dolmetscher wird einfach für die Variablennamen suchen in lokalen, closured und globalen Bereichen, nicht tatsächlich Objekt nachschauen Eigenschaften

Sie können dies möglicherweise in TypeScript tun, indem Sie die Funktion definition in den Hauptteil des Konstruktors verschieben (wo Sie Zugriff auf die geschlossene Variable $scope haben). Hier sind wir auch in der Nähe über config und dann in der Funktion:

class AdminHomeController { 

    configChanged:()=>void; // Need to declare the function 

    constructor(private $scope: any) { 
     var config = $scope.config; 
     this.configChanged =()=> { // And then assign it 
      config.clear(); 
     }; 
    } 
} 

Wie Sie sehen können, ist es nicht elegant ist. Sie haben Funktionsdefinition + Deklarationssplit. Außerdem wird der Konstruktorkörper unnötig schwer.

TypeScript ist hier nicht schuld. Es ist nur JavaScript.

0

In Javascript definitiv nicht, und in Typoskript Ich bin mir ziemlich sicher nicht. Referenzen in Javascript binden lexikalisch, nicht wie auch immer die andere aufgerufen wird. Wenn Sie "this" weglassen, sucht der Interpreter einfach nach dem Variablennamen in lokalen, geschlossenen und globalen Bereichen, nicht nach Objekteigenschaften. Du brauchst eine Art magische Flagge, um zu sagen: "Diese Variable ist eine Objekteigenschaft", und die Art und Weise, wie dies implementiert wird, ist mit "dies".

Dies ist sehr üblich in Javascript. Kompilierte Sprachen wie Java leiden nicht unter diesem Problem, und ich bin mir nicht sicher über andere dynamische Sprachen. Es ist nicht unbedingt schwer zu lösen. Es ist einfach nicht so, wie JS Dinge getan hat (wohl falsch).

+0

Sie erwähnen "es ist nicht sehr schwer zu lösen". So kann ich es für meine Bedürfnisse lösen. – Alan2

+0

@Alan Ja, ich glaube, es gibt keine theoretische Schwierigkeit beim Schreiben einer neuen Sprache, die in JS kompiliert wird und dieses Problem nicht hat. – djechlin

Verwandte Themen