创建自定义枚举类型

时间:2017-02-01 15:37:59

标签: sapui5

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

我的问题是:

  • 如何创建枚举类型?
  • 在自定义控件上,您只能传递属性枚举
    类型。如何验证给定的枚举是否有效?

2 个答案:

答案 0 :(得分:3)

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

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

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

话虽如此,为了实际使用枚举对象:

  1. 必须首先全局访问枚举对象。一种方法是定义一个由普通对象组成的模块,并使其在模块名称下可用。例如:

    /**
    * 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"
    
  2. 必须将对象的模块名称分配给属性定义中的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"
            },
          },
        },
        // ...
      });
    });
    
  3. 在上面的示例中,selectedColor属性仅等待"Red""Blue""Yellow"。我们来测试一下:

    • new MyColorBox().getMetadata().getProperty("selectedColor").getType().isEnumType()返回truegetType返回创建的sap.ui.base.DataType对象)✔️
    • new MyColorBox().setSelectedColor("Hans")按预期抛出错误:

        

      “Hans”是字符串类型,期望demo.custom.control.type.enum.PrimaryColor属性“selectedColor”...✔️

    • new MyColorBox().setSelectedColor("Yellow")成功存储了值✔️

    注意

    • 尝试通过DataType.create创建枚举类型。

        

      使用此方法无法创建数组类型和枚举类型。当查找这样的类型时,DataType.getTypedefaultValue创建即时 [source]

    • 根据getType reference,枚举类型的默认值将是第一个键。

        

      "Red"将是普通对象中找到的第一个键的值。

      ..在我们的案例中将是thatEnumType.getDefaultValue()。但只有在调用"Red"时才会出现这种情况。值defaultValue不适用于控件元数据中PropertydefaultValue。如果没有另外定义,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?
}