我在sapui5中编写了一个自定义控件。它是一个虚拟键盘(屏幕键盘),具有MatrixLayout和许多按钮作为聚合。我添加了一个" public"控制功能应该允许我禁用一些按钮。但是当我试图在这个函数中访问它时,我的所有聚合除了我的MatrixLayout-Aggregation都是null。
有人可以帮我解决如何访问我的聚合(按钮)的问题吗? 我已经尝试了隐藏和公开的可见性。我确实看到了生成的访问器,但那些返回" null"太。 如果我试图获得聚合" _layout"我的MatrixLayout已退回。
我试图以这种方式访问它:
onVirtualKeyboardClickBase : function(oEvent, oController){
var virtualKeyboard = oEvent.getSource().disableButton("_btnMinus");
}
这是自定义控件的代码:
(function () {
"use strict";
jQuery.sap.declare("de.vw.timerec.controls.VirtualKeyboard");
$.sap.includeStyleSheet("css/VirtualKeyboard.css");
jQuery.sap.require("sap.ui.commons.Button");
sap.ui.core.Control.extend("de.vw.timerec.controls.VirtualKeyboard", {
// the control API:
metadata : {
properties : {
/* Business Object properties */
"title" : {type : "string"},
"width" : {type: "sap.ui.core.CSSSize", defaultValue: "253px" },
"buttonWidth" : {type: "sap.ui.core.CSSSize", defaultValue: "57px" },
"buttonHeight" : {type: "sap.ui.core.CSSSize", defaultValue: "57px" }
},
aggregations : {
"_layout" : {type : "sap.ui.commons.layout.MatrixLayout", multiple : false, visibility: "hidden"},
"_btn1" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn2" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn3" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btnDel" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn4" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn5" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn6" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btnAlpha" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn7" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn8" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn9" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btnBack" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btn0" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btnComma" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"},
"_btnMinus" : {type : "sap.ui.commons.Button", multiple : false, visibility: "public"},
"_btnNext" : {type : "sap.ui.commons.Button", multiple : false, visibility: "hidden"}
},
associations: { },
events : {
click : {enablePreventDefault : true}
}
},
init : function() {
var oControl = this;
var oMatrixLayout;
var oBtn1, oBtn2, oBtn3, oBtnDel, oBtn4, oBtn5, oBtn6, oBtnAlpha,
oBtn7, oBtn8, oBtn9, oBtnBack, oBtn0, oBtnComma, oBtnMinus, oBtnNext;
oMatrixLayout = new sap.ui.commons.layout.MatrixLayout({
id : this.getId() + "-matrixLayout",
layoutFixed : true,
columns : 4,
width : "100%"
});
this.setAggregation("_layout", oMatrixLayout);
oBtn1 = this._createButton("1", "1", oControl, true);
this.setAggregation("_btn1", oBtn1);
oBtn2 = this._createButton("2", "2", oControl, true);
this.setAggregation("_btn2", oBtn2);
oBtn3 = this._createButton("3", "3", oControl, true);
this.setAggregation("_btn3", oBtn3);
oBtnDel = this._createButton("", "delete", oControl, false);
oBtnDel.setIcon("sap-icon://undo");
this.setAggregation("_btnDel", oBtnDel);
oMatrixLayout.createRow(oBtn1, oBtn2, oBtn3, oBtnDel);
oBtn4 = this._createButton("4", "4", oControl, true);
this.setAggregation("_btn4", oBtn4);
oBtn5 = this._createButton("5", "5", oControl, true);
this.setAggregation("_btn5", oBtn5);
oBtn6 = this._createButton("6", "6", oControl, true);
this.setAggregation("_btn6", oBtn6);
oBtnAlpha = this._createButton("Alpha", "alpha", oControl, false);
this.setAggregation("_btnAlpha", oBtnAlpha);
oMatrixLayout.createRow(oBtn4, oBtn5, oBtn6, oBtnAlpha);
oBtn7 = this._createButton("7", "7", oControl, true);
this.setAggregation("_btn7", oBtn7);
oBtn8 = this._createButton("8", "8", oControl, true);
this.setAggregation("_btn8", oBtn8);
oBtn9 = this._createButton("9", "9", oControl, true);
this.setAggregation("_btn9", oBtn9);
oBtnBack = this._createButton("", "back", oControl, false);
oBtnBack.setIcon("sap-icon://arrow-top");
this.setAggregation("_btnBack", oBtnBack);
oMatrixLayout.createRow(oBtn7, oBtn8, oBtn9, oBtnBack);
oBtn0 = this._createButton("0", "0", oControl, true);
this.setAggregation("_btn0", oBtn0);
oBtnComma = this._createButton(",", ",", oControl, true);
this.setAggregation("_btnComma", oBtnComma);
oBtnMinus = this._createButton("-", "-", oControl, true);
this.setAggregation("_btnMinus", oBtnMinus);
oBtnNext = this._createButton("", "next", oControl, false);
oBtnNext.setIcon("sap-icon://arrow-bottom");
this.setAggregation("_btnNext", oBtnNext);
oMatrixLayout.createRow(oBtn0, oBtnComma, oBtnMinus, oBtnNext);
},
onAfterRendering: function () {
},
_createButton : function (text, buttonValue, oControl, isDigitButton) {
var styleClassName = "virtualKeyboardButtonDigit";
if (!isDigitButton) styleClassName = "virtualKeyboardButtonSpecial";
var buttonIdHelper = buttonValue;
if (buttonValue == ",") {
buttonIdHelper = "comma";
}
if (buttonValue == "-") {
buttonIdHelper = "minus";
}
var buttonId = this.getId() + "virtualKeyboardButton_" + buttonIdHelper;
var oBtn = new sap.ui.commons.Button({
id: buttonId,
text: text,
width: this.getProperty("buttonWidth"),
height: this.getProperty("buttonHeight"),
press: function (oEvent) {
oControl.fireClick({
buttonValue : buttonValue
});
}
}).addStyleClass("virtualKeyboardButton " + styleClassName);
return oBtn;
},
disableButton : function (buttonName)
{
// this.getAggregation(<any button aggregation>) returns "null"
// this.getAggregation("_layout") returns the MatrixLayout-Aggregation
this.getAggregation(buttonName).setEnabled(false);
},
renderer : {
render : function(oRm, oControl) {
oRm.write("<div");
oRm.writeControlData(oControl);
oRm.addStyle("width", oControl.getWidth());
oRm.addStyle("margin-left", "44px");
oRm.writeStyles();
oRm.write(">");
oRm.renderControl(oControl.getAggregation("_layout"));
oRm.write("</div>");
}
}
});
de.vw.timerec.controls.VirtualKeyboard.prototype.exit = function () {
};
}());
答案 0 :(得分:3)
如果在MatrixLayout中向Aggregations添加Button,它们将自动从控件的聚合中删除。聚合内容只能同时在一个聚合中。您必须通过ID访问它们。这就是UI5关联的用途(它们基本上是包含控件实例ID的组)。