2017-02-01 2 views
1

Mit qooxdoo 5.0.2 (oder frühere Version) Ich Unterklasse ein Tablet-Widget und überschreiben _onKeyPress Methode. Dann erzeuge ich Quelle, ich bekomme ein korrektes Verhalten, aber mit generate Build ist das Verhalten anders.Ich kann ein seltsames Verhalten nicht verstehen, Tablet-Widget Unterklasse

Ich vereinfachte meine Frage, mit diesem Beispiel unten. Ich Unterklasse Tabelle Widget und überschreiben _onKeyPress Methode mit dem gleichen Code von qooxdoo 5.0.2 Tabelle Widget Quelle. Führen Sie das Beispiel aus, bearbeiten Sie eine Zelle, und drücken Sie die Eingabetaste.

Mit

var tbl = new qx.ui.table.TableModified(tableModel) 

das Verhalten ist schlecht. Mit

var tbl = new qx.ui.table.Table(tableModel) 

das Verhalten korrekt ist.

Wenn Sie das Beispiel in ein leeres 5.0.2-Projekt einfügen, das qx.ui.table.TableModified verwendet, erhalten Sie ein Verhalten, wenn Sie Quelle kompilieren, und ein anderes mit Compile Build.

Was ist daran falsch? Wo ist mein Fehler?

Playground example

Antwort

1

In qooxdoo gibt es pro Konvention geschützt und private Teilnehmer, wie Methoden oder Instanzvariablen. Geschützte Mitglieder beginnen mit einem Unterstrich wie _myProtectedMethod, private Mitglieder beginnen mit zwei Unterstrichen wie __myPrivateMethod. Die geschützten Mitglieder sind vom Build-Prozess nicht betroffen und bleiben so wie sie sind. Auf diese Weise können sie von abgeleiteten Klassen überschrieben werden.

Private Mitglieder werden vom Compiler zu einem zufälligen Namen verschleiert, so dass der Versuch, auf die private Methode oder Variable außerhalb der Klasse zuzugreifen, in der sie definiert sind, zu einer Ausnahme führt.

In Ihrem Spielplatzbeispiel haben Sie die Methode _onKeyPress außer Kraft gesetzt, die per se überschrieben werden kann, da sie ein geschütztes Mitglied ist.

Aber innerhalb der überschriebenen Code verwenden Sie private Mitglieder wie this.__focusedRow, die fehlschlägt, weil in der Build-Version gibt es keine __focusedRow Mitglied, wie es verschleiert wurde. Es gibt mehr private Mitglieder im Code wie __focusedCol, __selectionManager usw.

erfolgreich Um die Methode überschreiben, müssen Sie diese private Mitglieder durch ihre Accessoren zu ersetzen, wie this.getFocusedRow() statt this.__focusedRow, this.getFocusedColum() statt this._focusedCol usw.

+0

Danke. Ich vermutete es, ich brauchte eine Bestätigung, weil mich das Verhalten von Source/Build-Verhalten verwirrte. Jetzt funktioniert ok. Ich weiß nicht, wie diese Website auf Antwortqualifikationen funktioniert, was ich jetzt tun muss. Ich werde darüber lesen. – fsaiyuk2002

+0

Ich bin froh, dass ich helfen konnte. Bitte akzeptieren Sie meine Antwort, wenn in SO, wenn es Ihre Frage beantwortet. Vielen Dank. – level420