让我们想象一下我有一个班级
sap.ui.core.Control.extend("sap.my.MyButton", {
metadata: {
properties: {
"isButtonWithMenu": {
type: "boolean",
defaultValue: true
}
}
}
},
init: function () {
if (this.getIsButtonWithMenu()) {
this.myButton = this._createMenuButton();
} else {
this.myButton = this._createNormalButton();
}
var baseBox = new sap.m.FlexBox();
baseBox.addItem(this.myButton);
this.setLayout(baseBox);
}
现在我想将isButtonWithMenu
的值传递到我的init
方法中,然后执行以下操作:
var myButton = new sap.my.MyButton({isButtonWithMenu: false});
但这并不起作用,这意味着我没有在课堂上传递价值。但是,当我更改defaultValue
时,它确实有效,那么,这里有什么问题以及我如何实现目标?
答案 0 :(得分:3)
您的问题是由代码here in the ManagedObject's constructor引起的。此类是任何控件的超类(ManagedObject< - Element< - Control)。如果查看代码,您会注意到以下步骤:
init
方法。mSettings
属性包适用于您的控件。此属性包是您(或XML视图解析器)在控件构造函数中传递的属性包。这是UI5的设计行为。因为init
函数应该将控件置于初始化状态,然后才将属性(传递给构造函数)应用于控件。这样可以确保在重新定义控件之后,任何重新定义的setter都会在之后调用(好吧,至少除了在初始化代码中调用它们的情况之外)。
为了解决这个问题,你有两个我可以考虑的选择:
jQuery.sap.delayedCall(0, this, function() { this.myButton = ... })
以确保设置已应用于您的控件。constructor
方法。有点像: sap.ui.core.Control.extend("sap.my.MyButton", {
metadata: { /* same as before */},
constructor: function () {
sap.ui.core.Control.apply(this, arguments);
// the init function was already called by this point
// also the settings should have been applied
if (this.getIsButtonWithMenu()) {
this.myButton = this._createMenuButton();
} else {
this.myButton = this._createNormalButton();
}
var baseBox = new sap.m.FlexBox();
baseBox.addItem(this.myButton);
this.setLayout(baseBox);
}
})
您也可以在超级构造函数调用之前放置代码(从OOP角度来看并不是真的正确),但是您不能使用getter,而应该查看mSettings
构造函数参数(第2个参数)。< / p>