我无法理解一个奇怪的行为,子类化平板电脑小部件

时间:2017-02-01 14:21:05

标签: qooxdoo

使用qooxdoo 5.0.2(或以前的版本)我将平板电脑小部件子类化并覆盖_onKeyPress方法。 然后,生成源我得到了正确的行为,但是对于生成构建,行为是不同的。

我简化了我的问题,下面是这个例子。 我将表格小部件子类化,并使用qooxdoo 5.0.2表格小部件源中的相同代码覆盖_onKeyPress方法。 运行示例,编辑单元格,然后按Enter键。

使用

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

行为不好。 使用

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

行为是正确的。

如果你把这个例子放在一个空白的5.0.2项目中,使用qx.ui.table.TableModified,你会得到一个行为,如果是编译源代码,另一个是编译版本。

这有什么问题?我的错误在哪里?

Playground example

1 个答案:

答案 0 :(得分:1)

在qooxdoo中,按照惯例,受保护的私有类成员(如方法或实例变量)。受保护的成员以.slidef { transition: width 1s linear 1s, height 1s linear 1s, right 1s linear 1s, transform 1s linear 0s; width: 400px; height: 400px; right: 300px; -webkit-transform: perspective(0px) rotateY(0deg); } 这样的下划线开头,私有成员以_myProtectedMethod这两个下划线开头。受保护的成员不受构建过程的影响,并保持原样。这样,派生类就可以覆盖它们。

编译器将私有成员混淆为随机名称,因此尝试访问定义它们的类之外的私有方法或变量会导致异常。

在您的游乐场示例中,您已覆盖方法__myPrivateMethod,该方法本身可以覆盖,因为它是受保护的成员。

但是在被覆盖的代码中,您使用_onKeyPress之类的私有成员失败了,因为在构建版本中,由于它被混淆了,所以不再有this.__focusedRow成员。代码中有更多私人成员,例如__focusedRow__focusedCol等。

要成功覆盖该方法,您必须使用其访问者替换这些私有成员,例如__selectionManager而不是this.getFocusedRow()this.__focusedRow而不是this.getFocusedColum()等。