我想为https://sapui5.hana.ondemand.com/docs/api/symbols/sap.ui.core.ValueState.html#.Error等自定义控件创建自定义枚举类型。
我的问题是:
答案 0 :(得分:3)
以下是一个示例:https://embed.plnkr.co/DhtkXOkMi12D1AYK
要在UI5中创建枚举类型,需要考虑某些规则:
{
Red: "Red",
Blue: "Blue",
Yellow: "Yellow"
}
话虽如此,为了实际使用枚举对象:
必须首先全局访问枚举对象。一种方法是定义一个由普通对象组成的模块,并使其在模块名称下可用。例如:
/**
* file: MyColor.js
* path: "custom/control/type/"
* namespace: "demo"
*/
sap.ui.define({ // module value
Red: "Red",
Blue: "Blue",
Yellow: "Yellow",
}, true); // resulting module name: "demo.custom.control.type.MyColor"
必须将对象的模块名称分配给属性定义中的type
:
sap.ui.define([
"sap/ui/core/Control",
"./MyColorBoxRenderer",
"./type/MyColor", // Defines the module and prevents fetching it via sync XHR
], function(Control) {
"use strict";
return Control.extend("demo.custom.control.MyColorBox", {
metadata: {
properties: {
"selectedColor": {
type: "demo.custom.control.type.MyColor"
},
},
},
// ...
});
});
在上面的示例中,selectedColor
属性仅等待"Red"
,"Blue"
或"Yellow"
。我们来测试一下:
new MyColorBox().getMetadata().getProperty("selectedColor").getType().isEnumType()
返回true
(getType
返回创建的sap.ui.base.DataType对象)✔️ new MyColorBox().setSelectedColor("Hans")
按预期抛出错误:
“Hans”是字符串类型,期望demo.custom.control.type.enum.PrimaryColor属性“selectedColor”...✔️
new MyColorBox().setSelectedColor("Yellow")
成功存储了值✔️ 不尝试通过DataType.create
创建枚举类型。
使用此方法无法创建数组类型和枚举类型。当查找这样的类型时,
DataType.getType
由defaultValue
创建即时。 [source]
根据getType
reference,枚举类型的默认值将是第一个键。
"Red"
将是普通对象中找到的第一个键的值。
..在我们的案例中将是thatEnumType.getDefaultValue()
。但只有在调用"Red"
时才会出现这种情况。值defaultValue
不适用于控件元数据中Property的defaultValue
。如果没有另外定义,undefined
将只是_
。
答案 1 :(得分:0)
首先定义你的枚举...
<强> MessageType.js 强>
sap.ui.define([], function() {
"use strict";
return {
Unread: "Unread",
Read: "Read"
};
});
接下来,将此枚举标记为自定义控件中的依赖项,以便您能够验证该值。
<强> MyControl.js 强>
sap.ui.define(["sap/ui/core/Control", "/path/to/MessageType.js"], function(Control, MessageType) {
Control.extend("myControl", {
someMethod: function(sMessageType) {
// Validate if we are dealing with a valid message type
var aKeys = Object.keys(MessageType);
var bValidEnumValue = aKeys.some(function(sKey) {
if (MessageType[sKey]) {
return true;
}
});
// Do other stuff..
}
});
});
当然,检查你是否处理有效枚举值的方法可以用不同的方式实现,具体取决于你想要做什么。
if (sMessageType === MessageType.Read) {
// do something
} else if (sMessageType === MessageType.Unread) {
// do something else
} else {
// throw an error?
}