创建一个OpenUI5控件时免不了声明几个属性,例如:
metadata: {
properties: {
"msg" : {type : "string", defaultValue : "kx123"},
"byProxy" : {type : "boolean", defaultValue : true}
},
publicMethods: [
],
events: {
complete : {enablePreventDefault : true}
}
}
可是属性都支持那些数据类型呢?搜了一下OpenUI5 开发指南,并没有找到什么有用的信息。还是得从代码里面寻觅,结果发现答案就在sap.ui.base.DataType里。
var mTypes = {
"any" :
createType("any", {
defaultValue : null,
isValid : function(vValue) {
return true;
}
}),
"boolean" :
createType("boolean", {
defaultValue : false,
isValid : function(vValue) {
return typeof vValue === "boolean";
}
}),
"int" :
createType("int", {
defaultValue : 0,
isValid : function(vValue) {
return typeof vValue === "number" && Math.floor(vValue) == vValue;
}
}),
"float" :
createType("float", {
defaultValue : 0.0,
isValid : function(vValue) {
return typeof vValue === "number";
}
}),
"string" :
createType("string", {
defaultValue : "",
isValid : function(vValue) {
return typeof vValue === "string" || vValue instanceof String;
}
}),
"object" :
createType("object", {
defaultValue : null,
isValid : function(vValue) {
return typeof vValue === "object" || typeof vValue === "function";
}
})
};
DataType.getType = function(sTypeName) {
var oType = mTypes[sTypeName];
if ( !oType ) {
// check for array types
if (sTypeName.indexOf("[]") > 0) {
var sComponentTypeName = sTypeName.slice(0, -2),
oComponentType = this.getType(sComponentTypeName);
oType = oComponentType && createArrayType(oComponentType);
if ( oType ) {
mTypes[sTypeName] = oType;
}
return oType;
} else {
oType = jQuery.sap.getObject(sTypeName);
if ( oType instanceof DataType ) {
mTypes[sTypeName] = oType;
} else if ( jQuery.isPlainObject(oType) ) {
oType = mTypes[sTypeName] = createEnumType(sTypeName, oType);
}
}
}
return oType;
};
有上面代码可知,首先支持的基本数据类型有any、boolean、int、float、string和object。
支持数组,但是数组项的类型必须是支持的基本数据类型。例如"messages" : {type : “string[]",defaultValue : “mryqu,kx123”}。其中类型以[]结尾,值用逗号分隔。
此外支持可枚举的属性,即扁平对象(使用”{}“或"new Object"创建而得) 对sap.ui.base.DataType的值解析、属性有效性验证等细节除了研究代码外,还可参考单元测试DataType.qunit.html。