如何在SAPUI5中将属性值传递给init方法?

时间:2017-06-08 06:39:13

标签: javascript sapui5

让我们想象一下我有一个班级

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时,它确实有效,那么,这里有什么问题以及我如何实现目标?

1 个答案:

答案 0 :(得分:3)

您的问题是由代码here in the ManagedObject's constructor引起的。此类是任何控件的超类(ManagedObject< - Element< - Control)。如果查看代码,您会注意到以下步骤:

  • 构建 empty 属性包(实际上是您的默认值)。
  • 调用控件的init方法。
  • mSettings属性包适用于您的控件。此属性包是您(或XML视图解析器)在控件构造函数中传递的属性包。

这是UI5的设计行为。因为init函数应该将控件置于初始化状态,然后才将属性(传递给构造函数)应用于控件。这样可以确保在重新定义控件之后,任何重新定义的setter都会在之后调用(好吧,至少除了在初始化代码中调用它们的情况之外)。

为了解决这个问题,你有两个我可以考虑的选择:

  • 使用0延迟通话技巧(有关说明,请参阅What is setTimeout doing when set to 0 milliseconds?)。基本上您可以执行: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>