2016-12-18 2 views
0

Mein Problem ist sehr einfach. Grundsätzlich habe ich eine Controller- und eine View-Klasse. Wenn ich auf eine Schaltfläche klicke, sagt der Controller der Ansicht, dass etwas angezeigt werden soll. Problem ist, der Controller kann nicht. Hier ist der Code.Aufrufen von Funktionen aus einer anderen Klasse in es6

class Controller { 
 

 
    constructor(view) { 
 
     view = new View(); 
 
     
 
     let button = document.getElementById('button'); 
 
     button.addEventListener('click',() => { 
 
      controller.doThing(); 
 
     }); 
 
    } 
 
    
 
    doThing() { 
 
     view.drawThing(5, 5); 
 
    } 
 

 
} 
 

 
class View { 
 
    
 
    constructor(controller) { 
 
     let canvas = document.getElementById('canvas'); 
 
     let pen = canvas.getContext('2d'); 
 
     
 
     this.controller = Controller; 
 
     this.drawThing = drawThing(); 
 
    } 
 

 
    drawThing(x, y) { 
 
     pen.beginPath(); 
 
     pen.moveTo(0, 0); 
 
     pen.lineTo(x, y); 
 
     pen.stroke(); 
 
    } 
 

 
}

Das Ergebnis davon ist ein

Uncaught TypeError: Cannot read property 'drawThing' of undefined 
at Controller.doThing (Controller.js:17) 
at HTMLButtonElement.Controller.button.addEventListener (Controller.js:12) 

Antwort

7

Die view Variable nur an den Konstruktor scoped wird. Sie sollten this.view statt:

class Controller { 

    constructor(view) { 
     this.view = new View(); 

     let button = document.getElementById('button'); 
     button.addEventListener('click',() => { 
      controller.doThing(); 
     }); 
    } 

    doThing() { 
     this.view.drawThing(5, 5); 
    } 

} 
+1

Alternativ Ich vermute, die 'view' in den Konstruktor übergeben soll eine Art Umkehrung der Steuer Umsetzung. Könnten Sie diese Option auch zeigen? –

+0

@MadaraUchiha Meinst du, 'view' sollte' this.view' zugewiesen werden? Ich bin mir nicht sicher, was der OP mit diesem Code erreichen möchte. –

+0

@Gothdo Was Sie vorgeschlagen haben funktioniert wie ein Charme. Danke vielmals. Allerdings sagt es mir jetzt, dass es die Eigenschaft 'beginPath' in der Ansicht nicht lesen kann. Das ist merkwürdig, weil ich mich nicht daran erinnern kann, Bibliotheken von Drittanbietern zu benutzen, wenn sie uns mit diesem Code im Unterricht arbeiten ließen. Wie auch immer, danke für die Antwort. – Alex

Verwandte Themen