2016-04-24 2 views
0

Ich habe eine Klasse in Ecmascript 6. Ich muss einen Wert von "this" an einen Rückruf übergeben.pass 'dies' auf Callback in einer Klasse ecmascript 6

Ich versuchte mit .bind (this). Bis jetzt scheint das nicht zu funktionieren. Ich habe auch versucht, var_this = this; und benutze _this innerhalb des Callbacks. es funktioniert immer noch nicht

 class Modal { 
     constructor(modal) { 
     this._modal = modal; 
     this.id = this._options.id;  
     } 
    } 

    open(opts) { 
     let modalOptions = { 
      size: opts.size || '', 
       templateUrl: 'modal.html', 
       controller: function controller($scope, $uibModalInstance) { 
        var _this = this; 
        this._options = { 
         id: opts.id 
        }; 
        this.hcbuttons: [{id: '1', name: 'test'}, {id: '2', name: 'abc'}]; 
        publisher.subscribe('triggered', this._options.id, function(event, creator) { 
         //as soon as we subscribe to the published event 
         var result = this.hcbuttons.filter(function(obj) { 
          return obj.id == creator; 
         })[0]; 
         if(result.sync === true) { 
          console.log('disabledall'); 
         }       
        }).bind(this); 


     } 

} 
+0

Was möchten Sie, dass dies zu sein? –

+0

die modalinstance, im Grunde möchte ich 'this.hcbuttons' an den Rückruf – looneytunes

+0

@looneytunes übergeben, bitte zuerst die Einrückung und die Klammern, dann erklären, was Sie dort tatsächlich gebaut haben. Dann können wir auf der gleichen Ebene sprechen – Thomas

Antwort

3

Sie sind verbindlich zu Unrecht die this. Sie rufen die Bindung über den zurückgegebenen Wert subscribe Funktion auf. Funktion Objekt hat nur die Funktion bind in seinem Prototyp. Also chance deinen Code von }).bind(this); zu }.bind(this)).

Da Sie this als modal Klasse festlegen möchten,

//change one 
open(opts) { 
     var _this = this; 
     let modalOptions = { 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
//change two 
}.bind(_this)); 
+0

versuchte es, funktioniert immer noch nicht @Rajaprabhu Aravindasamy – looneytunes

+0

@looneytunes Wenn Sie möchten, dass modalOptions das 'dies' innerhalb dieses Ereignisses ist, dann würde mein erster Vorschlag funktionieren. Wenn du willst, dass das 'Modal' das' This' ist, dann benutze meinen zweiten Vorschlag. –

2

Wenn Sie ES2015 verwenden, verwenden warum nicht lambdas (Pfeil-Funktionen)? Sie binden diese automatisch

open(opts) { 
    let modalOptions = { 
    size: opts.size || '', 
    templateUrl: 'modal.html', 
    controller: function controller($scope, $uibModalInstance) { 
     this._options = { 
     id: opts.id 
     }; 
     this.hcbuttons = [{ 
     id: '1', 
     name: 'test' 
     }, { 
     id: '2', 
     name: 'abc' 
     }]; 
     publisher.subscribe('triggered', this._options.id, (event, creator) => { 
     let result = this.hcbuttons.filter(obj => obj.id === creator)[0]; 
     if (result.sync) { 
      console.log('disabledall'); 
     } 
     }); 
    } 
    } 
} 

Hier können Sie mehr auf Pfeil Funktionen lesen: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions und wie sie funktionieren (könnten Sie in Zukunft helfen).

Verwandte Themen