创建自定义枚举类型

问题描述 投票:0回答:2

我想为自定义控件创建自定义枚举类型,例如https://sapui5.hana.ondemand.com/docs/api/symbols/sap.ui.core.ValueState.html#.Error.

我的问题是:

  • 如何创建枚举类型?
  • 在自定义控件上,您将只能传递属性枚举
    类型。如何验证给定的枚举是否有效?
sapui5
2个回答
3
投票

这是一个示例:https://embed.plnkr.co/DhtkXOkMi12D1AYK

为了在 UI5 中创建枚举类型,需要考虑某些规则:

  • 枚举定义必须是普通对象。在内部,它通过
    sap/base/util/isPlainObject
    进行验证。
  • 每个键值对必须彼此相同
  • 不支持重命名。
  • string类型的键和值 支持。
{
  "Red": "Red",
  "Blue": "Blue",
  "Yellow": "Yellow"
}

为了实际使用枚举对象:

  1. 从 UI5 1.120 开始,枚举对象必须使用

    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.
    
  2. 对象的模块名称必须分配给属性元数据中的

    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

 创建的。 
(来源)

参考文献


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? }
    
© www.soinside.com 2019 - 2024. All rights reserved.