【问题标题】:How to pass property value into init method in SAPUI5?如何将属性值传递给 SAPUI5 中的 init 方法?
【发布时间】:2017-06-08 06:39:12
【问题描述】:

假设我有一堂课

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 时,它确实起作用了,所以,这里出了什么问题以及如何实现我的目标?

【问题讨论】:

  • 变量isButtonWithMenu设置在哪里?
  • 我在对象创建期间将其设置为 false。据我了解,它应该在幕后应用并将属性设置为正确的值,我错了吗?

标签: javascript sapui5


【解决方案1】:

您的问题是由代码here in the ManagedObject's constructor 引起的。此类是任何控件的超类(ManagedObject

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

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

要解决这个问题,我可以考虑两种选择:

  • 使用 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 构造函数参数(第二个参数)的内部。

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多