Gibt eine Seite an, die Backbone.js verwendet, um eine Sammlung mit einer Ansicht zu verknüpfen ( RowsView
, erstellt <ul>
), die Unteransichten ( RowView
, creates <li>
) für jedes Modell in der Sammlung erstellt Ich habe ein Problem mit der Einrichtung der Inline-Bearbeitung für diese Modelle in der Sammlung.
Ich habe eine edit()
-Methode für die RowView
-Ansicht erstellt, die den Inhalt von li
durch ein Textfeld ersetzt. Wenn der Benutzer in diesem Textfeld tab
drückt, möchte ich den% -Zeichen auslösen. co_de% Methode der nächsten Ansicht in der Liste.
Ich kann das Modell des nächsten Modells in der Sammlung abrufen:
%Vor% Aber die Frage ist, wie man die View findet, die an das Model angehängt ist. Das übergeordnete Element edit()
View behält keinen Verweis auf alle untergeordneten Ansichten. Es ist RowsView
Methode ist nur:
Muss ich es neu schreiben, um ein separates Array von Zeigern auf alle render()
s zu erhalten, die es darunter hat? Oder gibt es eine kluge Möglichkeit, die View zu finden, an die ein bekanntes Modell angehängt ist?
Hier ist ein jsFiddle des ganzen Problems: Ссылка
Es ist nicht elegant, einen Verweis auf die Ansicht in Ihrem Modell zu speichern, Sie können jedoch eine Ansicht mit einem Modell mit Ereignissen verknüpfen, wie folgt:
%Vor%In RowView höre auf das Ereignis prepareEdit und in diesem Listener-Aufruf edit (), etwa so:
%Vor% Ich würde sagen, dass Ihre RowsView
die Komponente RowView
s im Auge behalten sollte. Die einzelnen RowView
s sind wirklich Teile von RowsView
und es ist sinnvoll, dass eine Ansicht ihre Teile verfolgen sollte.
Also würde Ihre RowsView
eine render
Methode wie folgt haben:
Dann brauchen Sie nur eine Möglichkeit, ein Tab in einen Index in this.child_views
zu konvertieren.
Eine Möglichkeit besteht darin, Ereignisse zu verwenden, Backbone-Ansichten haben Backbone.Events
gemischt, sodass Ansichten Ereignisse auf sich selbst auslösen können und andere Dinge diese Ereignisse abhören können. In deinem RowView
könntest du folgendes haben:
und Ihre RowsView
würden v.on('tab-next', this.edit_next);
in der this.collection.map
und Sie könnten eine edit_next
wie folgt sortieren:
Demo: Ссылка
Eine Variante wäre, einen Verweis auf RowsView
zu RowView
s hinzuzufügen, und dann könnte tab_next
direkt this.parent_view.edit_next()
aufrufen.
Eine weitere Möglichkeit ist, den keydown
Handler in RowsView
zu setzen. Dies fügt ein bisschen Kopplung zwischen RowView
und RowsView
hinzu, aber das ist wahrscheinlich kein großes Problem in diesem Fall, aber es ist ein bisschen hässlicher als die Ereignislösung:
Demo: Ссылка
Tags und Links backbone.js