在我的应用程序中,我必须渲染项目,任务和里程碑。项目和任务的色条不同,里程碑是菱形(我分别使用BaseRectangle
和BaseDiamond
)。
由于层次结构中的某些项目是“项目”,“某些任务”和“里程碑”,因此如何在每一行上呈现不同的形状?
我的第一个想法是使用常见的“可见”属性,但是形状没有这种属性,相反,“不透明”使事物不可见,但它们仍然对鼠标位置做出响应。
然后我尝试使用“聚合”工厂功能,但是尽管我的图表在第一次显示时可以正确呈现,但它不会在扩展或折叠的分支上重新计算形状。
在我看来,工厂功能应该可以工作,但是图表中出现了一些问题,不会向控制台抛出错误。
目前,在我的XML模板中,我具有以下内容:
rowSettingTemplate
具有shapes1={path: factory:}
且没有shapes1
元素。BaseShapes
的每个都位于一个不同的片段中,并作为受抚养人附加到我的TreeTable
上。示例形状片段-Project.fragment.xml
<core:FragmentDefinition xmlns:core="sap.ui.core" xmlns="sap.m" xmlns:gnt2="sap.gantt.simple">
<gnt2:BaseRectangle id="shapeProject"
shapeId="{plandata>id}" countInBirdEye="true"
time="{plandata>start_date}" endTime="{plandata>end_date}"
resizable="true" selectable="true" draggable= "true" connectable="true"
title="{plandata>text}" showTitle="true"
tooltip=""
fill="#0c1" />
</core:FragmentDefinition>
工厂功能:
shapeFactory: function(sId, oContext) {
var parentId = (/(.*)-\d+$/.exec(sId))[1];
var rowSettings = sap.ui.getCore().byId(parentId);
var node: Project.Node = oContext.getProperty();
if (String(node.id) == rowSettings.getProperty("rowId")) {
switch (node.type) {
case "project":
return this.byId('shapeProject').clone(sId);
case "task":
return this.byId('shapeTask').clone(sId);
case "milestone":
return this.byId('shapeMilestone').clone(sId);
default:
return this.byId('shapeErr').clone(sId);
}
} else {
return this.byId('shapeEmpty').clone(sId);
}
}
我的空形状是BaseGroup
-请注意,如果我从工厂退回null
,SAPUI5将会崩溃,因此当我实际上什么都不想要时,必须返回一些内容。
我还尝试将所有形状包装在BaseGroup
中,以使图表始终看到相同的控件类型,但这是行不通的。还要注意,如果我每次都返回一个Empty
的克隆而没有任何特殊逻辑,则该图表将正常工作。
我希望这是一项设置或确保聚合每次都能正常运行的功能。我的SAPUI5版本是1.61.2,我会花点时间尝试1.63.1,但我认为这个问题已经很深了。
如果有人有任何想法或示例代码,将不胜感激。
答案 0 :(得分:1)
我为此提出了一种解决方法,该方法可以节省某人几个小时。基本上,不是通过工厂函数定义shapes1聚合,而是使用了src
标签。 My Shapes1标记包含对我自己的自定义形状的引用,该自定义形状源自BaseRectangle。然后,我的自定义形状可以根据绑定的对象上下文呈现所需的任何SVG。现在,我的树可以展开和折叠,同时呈现所需的任何形状。
我的渲染器现在看起来像这样:
<shapes1>
我必须提供一个具有固定宽度的'getD'函数,我将仔细研究并重写几个函数,但是我认为这对我有用。