Wie binden Sie ein Backbone.js-Klickereignis an eine in einem HTML5-Zeichenbereich gerenderte Ansicht?

7

Ich beginne gerade mit Backbone.js , aber es sieht wirklich interessant aus ...

Im Moment wiederhole ich ein vorheriges Projekt, das verschiedene Objekte (2-3 verschiedene Modelltypen) in ein einziges HTML5-Canvas zeichnet.

Jedes Objekt ist anklickbar. Es gibt einen Ereignishandler für den Canvas, der den Speicherort des Klicks (lokal für das Canvas-Objekt) ermittelt und dann die Objekte nach einem Objekt durchsucht, das einen Treffer erzeugen könnte.

Gibt es eine bestimmte Methode oder Best Practice, die ich für ein Klickereignis in einer Backbone.js-Ansicht verwenden sollte?

Danke!

Update: gefunden fabric.js , das mit der Idee von Objekten innerhalb von a canvas-Element, bietet jedoch nicht das MVC-Stil-Framework als backbone.js.

Außerdem habe ich mir knockout.js angesehen. Es scheint noch mehr an HTML-Elemente (nicht Canvas) gebunden zu sein als an backbone.js.

    
Chris Butler 15.04.2011, 06:41
quelle

4 Antworten

9

Ich bin auf diese Frage gestoßen, weil ich an einem Backbone-basierten Framework für die Arbeit mit Canvas arbeite, also habe ich mich selbst damit auseinandergesetzt. Die Antwort, die ich schließlich bekam, war: Vergessen Sie die Verwendung von Backbone.View mit Canvas. Wenn es nicht durch ein DOM-Element dargestellt werden kann, dann ist es nicht sinnvoll, Backbone.View dafür zu verwenden ; Seine Eigenschaften werden nicht nur Canvas-Elementen zugeordnet.

Sie könnten Backbone.View verwenden, um ein einzelnes canvas DOM-Element darzustellen, aber das ist nicht das Szenario, das Sie beschreiben. Was Sie benötigen, ist eine benutzerdefinierte Ansichtsklasse, die Ihre Objekte im Canvas darstellen und deren Ereignisse behandeln kann.

    
Trevor Burnham 22.05.2011, 21:52
quelle
8

Ich arbeite auch an einem Kartenspiel mit Backbone.js auf Canvas und bin auf diese Frage gestoßen. Was ich gerade mache, ist ein CardView mit el als Canvas-Tag, damit bei der Initialisierung ein Canvas erstellt wird. Das Zeichnen der Karte erfolgt in der render -Methode dieser Ansicht. Diese Zeichenfläche wird jedoch nicht zum DOM hinzugefügt.

Ich habe dann ein Hand , was ein Backbone.Collection ist, um eine Sammlung von Karten zu halten. Diese Sammlung hat Backbone.View an den Spielbereich angehängt (der einzige und größte in DOM ). Diese Ansicht enthält auch ein Array von Backbone.View s. Dann habe ich:

%Vor%

Grundsätzlich zeichne ich die Leinwand jeder Ansicht mit drawImage des Kontextes in die Spielfläche.

I addEventListener to HandView 's Canvas (das ist el ), um den Klick zu verarbeiten. In diesem Handler überprüfe ich die Mauspositionen, für die CardView gilt, und manipuliere dann diese Ansicht.

Wohlgemerkt, ich experimentiere gerade damit, weil ich auch für Backbone.js neu bin. Dies ist vielleicht der schlechteste Weg, aber ich hoffe nur, dass du eine der Möglichkeiten sehen kannst, dies zu tun.

Ich wünschte, wir könnten die Maus gegen eine Leinwand prüfen, die im DOM nicht existiert. Wenn es möglich ist, könnten wir einfach addEventListener auf CardView 's Canvas setzen und es übersetzen und neu rendern lassen. Es ist nicht erforderlich, dass% canvas% s Canvas seine Ansichten durchläuft.

    
sntran 02.10.2011 06:35
quelle
4

Ich bin zu spät zu dieser Party, aber IMO weder Ansichten noch Modelle / Sammlungen sind nicht der Ort, um diese Art von Logik aufzunehmen.

Wenn Sie Fabric oder eine andere Bibliothek verwenden (ich habe eine Anwendung, die raphael.js verwendet), sollten Sie ein maßgeschneidertes Modul erstellen, das die Zeichnung / Manipulation behandelt und auf Canvas-Ereignisse reagiert, indem lokale Ereignisse behandelt werden a href="https://github.com/kangax/fabric.js/wiki/Working-with-events"> Ссылка ).

Wenn Sie diese Ereignisse mitteilen müssen, sollten Sie sie programmatisch offenlegen und Backbone-Ereignisse verwenden, um sie in anderen Hauptkomponenten zu veröffentlichen.

Sie sollten Ihre Modelle und Ansichten nicht in der oben vorgeschlagenen Weise fest koppeln.

    
Lee 17.07.2012 08:54
quelle
0

Ich beginne gerade mit backbone.js selbst, aber ich würde wahrscheinlich eine Backbone-Ansicht (z. B. canvasView) erstellen, die die Ereignisse auf der Leinwand rendert und überwacht. Das click-Ereignis kann an eine Methode für die View-Objekte gesendet werden, und in dieser Methode führen Sie Ihren Algorithmus für die Objektübereinstimmung und andere Logik durch.

    
Jens Alm 24.04.2011 10:08
quelle

Tags und Links