我想为自定义控件创建自定义枚举类型,例如https://sapui5.hana.ondemand.com/docs/api/symbols/sap.ui.core.ValueState.html#.Error.
我的问题是:
这是一个示例:https://embed.plnkr.co/DhtkXOkMi12D1AYK
为了在 UI5 中创建枚举类型,需要考虑某些规则:
sap/base/util/isPlainObject
进行验证。{
"Red": "Red",
"Blue": "Blue",
"Yellow": "Yellow"
}
为了实际使用枚举对象:
sap/ui/base/DataType.registerEnum
注册。例如:
/**
* In control/type/Color.js"
* Root namespace: "my.demo"
*/
sap.ui.define([
"sap/ui/base/DataType",
], (DataType) => {
"use strict";
const name = "my.demo.control.type.Color";
DataType.registerEnum(name, {
Red: "Red",
Blue: "Blue",
Yellow: "Yellow",
});
const colorType = DataType.getType(name);
return Object.freeze(colorType.getEnumValues());
}/*, true*//*no longer needed since UI5 1.120 thx to registerEnum*/);
// Exporting globally (true) is required until 1.119.
对象的模块名称必须分配给属性元数据中的
type
:
// in control/Square.js
sap.ui.define([
"sap/ui/core/Control",
"./type/Color", // require the module to register the enum
"...",
], function(Control) {
"use strict";
return Control.extend("my.demo.control.Square", {
metadata: {
properties: {
"selectedColor": {
type: "my.demo.control.type.Color", // <-- name of the enum
bindable: true,
},
},
},
// ...
});
});
在上面的示例中,
selectedColor
属性仅等待"Red"
、"Blue"
或"Yellow"
。我们来测试一下:
new Square().getMetadata().getProperty("selectedColor").getType().isEnumType()
返回 true
。 ✔️new Square().setSelectedColor("Hans")
按预期抛出错误:
“Hans”是字符串类型,预期为 Element [...] 的属性“selectedColor”的 my.demo.control.type.Color。 ✔️
new Square().setSelectedColor("Yellow")
成功存储该值。 ✔️不要尝试通过DataType.create
创建枚举类型。
此方法无法创建数组类型和枚举类型。当查找此类类型时,它们是由参考文献
DataType.getType
on-the-fly创建的。(来源)
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?
}