基本自定义 > 用户界面自定义 > 在 UI 中添加操作并进行挂接 > 定义菜单 > 显示操作 > 在表格中显示操作列
  
在表格中显示操作列
* 
无法再将操作列添加到表格中。操作列位于数据存储中,但在 UI 中不可用。操作菜单只能通过右键单击每一行来使用
1. 定义 actions.xml 文件中的操作 (请参阅定义新操作)
2. 将操作添加到操作模型 (请参阅定义新操作)。可在多个级别中为特定表格设置操作模型。以下所示已对其按复杂程度进行升序排列:
a. 定义业务对象类型的 "menufor" 属性。
在操作模型定义中 (在 XML 文件中),针对要为其定义操作的对象类型设置 "menufor" 属性。
<model name="part actions" menufor="wt.part.WTPart">
<action name="view" type="object"/>
.....
</model>
要获得从主菜单中飞出的菜单,请在操作模型中添加一个子菜单。
<model name="part actions" menufor="wt.part.WTPart">
<action name="action_1" type="object"/>
<submodel name="submenu_new"/>
</model>
<model name="submenu_new">
<action name="newViewVersion" type="part"/>
</model>
b. 在构建器中设置操作模型。
每个类型只能有一个具有 menufor 属性的操作模型。如果要覆盖表格的默认操作模型,可以在表构建器中指定一个不同的模型。有关创建表构建器类别的信息,请参阅 MVC 组件
public ComponentConfig buildComponentConfig (ComponentParams params) {
ComponentConfigFactory factory = getComponentConfigFactory ();
JcaTableConfig table = (JcaTableConfig) factory.newTableConfig ();
ColumnConfig actionsMenu = setComponentConfigFactory().
newColumnConfig(DescriptorConstants.ColumnIdentifiers.NM_ACTIONS, true);
(JcaColumnConfig)actionsMenu).setDescriptorProperty
(DescriptorConstants.ActionProperties.ACTION_MODEL,
"model_name_here");
table.addComponent(actionsMenu);
....
return table;
}
c. 创建自定义数据实用程序。
如果您因为需要计算要动态使用的操作模型而不能依赖于表格的 "menufor" 操作模型,则需要为操作列创建数据实用程序。您需要扩展 NmActionDataUtility 并覆盖 getDataValue() 方法。将组件描述符上的 DescriptorConstants.ActionProperties.ACTION_MODEL 特性设置为要使用的操作模型的名称:
public class CustomNmActionDataUtility extends NmActionDataUtility {
@Override
public Object getDataValue(String component_id, Object datum,
ModelContext mc) throws WTException {
String modelName = "foo";
if(...) {
modelName = "bar";
} else {
modelName = "baz";
}

mc.getDescriptor().setProperty( DescriptorConstants.
ActionProperties.ACTION_MODEL, modelName);
return super.getDataValue(component_id, datum, mc);

}
}
您可以为不同类型的基准 (行对象) 指定不同的操作模型,或根据模型上下文中的信息使用其他逻辑来确定要使用的操作模型。
* 
如果不想在操作列中显示任何操作,可将操作模型设置为 EMPTY_ACTION_MODEL。这样做时,操作列中将显示“没有可显示的操作”文本。
创建数据实用程序后,在构建器的表格中添加一列。使用自定义列 ID (即 "customNmActions") 而不是 DescriptorConstants.ColumnIdentifiers.NM_ACTIONS:
public ComponentConfig buildComponentConfig (ComponentParams params) {
ComponentConfigFactory factory = getComponentConfigFactory ();
JcaTableConfig table = (JcaTableConfig) factory.newTableConfig ();
ColumnConfig actionsMenu = setComponentConfigFactory().
newColumnConfig(“customNmActions”, true);

....
table.addComponent(actionsMenu);
....
return table;
}
最后,您需要为 *.xconf 条目中的自定义列 id 注册数据实用程序,例如:
<!-- Sample XCONF Entry -->
<Service name="com.ptc.core.components.descriptor.DataUtility">
<Option serviceClass="com.ptc.windchill.dataUtilities.
CustomNmActionDataUtility
" requestor="java.lang.Object"
selector="customNmActions" cardinality="singleton"/></Service>
故障排除
问题说明
解决方案
操作列未显示在表格中
默认情况下,不会显示操作列。不允许用户查看操作列。查看行操作的唯一方法是右键单击该行。
某些操作的图标缺失
为遵循 UI 标准,已将操作服务设计为只有图标也同时出现在系统中任意位置的某一工具栏中时,才会在操作菜单中显示这些图标。对于某些不属于任何工具栏的操作,如需解决此问题,您可以创建一个包含该操作的虚拟模型,例如:
<model name=”toolbarModelNotUsedAnywhere”>
<action name=”myAction” type=”myActionType”/>
</model>
然后,操作服务即会在操作菜单中显示为该操作定义的图标。
用户右键单击并获取以下错误消息:“没有可显示的操作”
确保在操作模型中 (在 XML 文件中) 为类型定义了 "menufor" 属性:menufor=”your.type.Here”
(或者,您可以定义在将列添加到表格配置时应在构建器中使用的模型)
将 NmActions 列标识符添加到 MVC 构建器中的表格配置中:
public ComponentConfig buildComponentConfig
(ComponentParams params) {
ComponentConfigFactory factory
= getComponentConfigFactory ();
JcaTableConfig table =
(JcaTableConfig) factory.newTableConfig ();
table.addComponent (factory.newColumnConfig
(DescriptorConstants.ColumnIdentifiers.NM_ACTIONS
, true));
....
return table;
}
使用 fiddler/firebug 检查在您右键单击时所进行的 servlet/ActionsMenu 请求上的 oid 参数。如果不是预期 oid,或者如果根本没有 oid,则基础结构无法从用于表格的支持对象中进行正确的 NmOid。有关如何控制用于表格中操作的 oid 的详细信息,请参阅 NmObjectUtility 文档。
如果要定义用于表格/列的操作模型 (将在预期结果下的“表格中的操作列”一节中介绍)。使用 fiddler/firebug 检查在您单击以获取菜单时所进行的 servlet/ActionsMenu 请求上的 actions 参数。actions 参数是否为您所定义的模型名称?如果 actions=EMPTY_ACTION_MODEL,则表示当前表格视图中未定义操作列。要使得右键单击菜单正常工作,必须定义操作列。尝试使用“视图”->“自定义...”选项将操作列添加到当前表格视图中。更改表构建器,使操作列成为默认列之一。
检查针对模型中的操作定义的验证器。是否隐藏状态的所有操作也将进行验证?如果是这样,则将 jcaDebug=true 添加为 URL 参数应在菜单中显示因已禁用而隐藏的各项操作的操作列表。
用户右键单击并获取以下错误消息:“您没有访问该对象的权限,或者对象不存在”
如果用户确实无权访问行对象,则此消息正常。
如果用户应具有访问权限 (例如,他们能够访问信息页面并查看操作菜单),则使用 fiddler/firebug 检查在您右键单击时所进行的 servlet/ActionsMenu 请求上的 oid 参数。如果不是预期 oid,或者如果根本没有 oid,则基础结构无法从用于表格的支持对象中进行正确的 NmOid。有关如何控制用于表格中操作的 oid 的详细信息,请参阅 NmObjectUtility 文档。
某些操作未显示在 UI 的列表中
可能是针对此操作配置的验证器在某些条件下隐藏了该操作。有关使用验证器配置操作的信息,请参阅 Windchill 客户端体系结构的操作框架
将 jcaDebug=true 添加到 URL,以查看隐藏的操作。启用 jcaDebug 选项后,菜单中将显示更多信息,并且列表的末尾会显示一项操作,用于转至该菜单的操作模型报告。
显示错误的操作集。
添加 jcaDebug=true,并检查菜单中的操作有哪些验证程序。检查验证器是否按预期运行。
1. 如果预期按类型查找操作模型 (将在预期结果下的“表格中的操作列”一节中介绍),是否在对象类型的操作模型上定义了 "menuFor"?
要查看操作服务针对行中的对象类型所找到的结果,请打开 log4j 记录器:com.ptc.netmarkets.util.misc. StandardNmActionService
2. 如果在表格/列上定义了要使用的模型 (将在预期结果下的“表格中的操作列”一节中介绍):
要查看默认数据实用程序返回的操作模型,请打开 log4j 记录器:com.ptc.core.components.factory.dataUtilities.NmActionDataUtility
jcaDebug 参数也会在菜单底部生成一个指向操作模型报告的链接。操作模型报告将涵盖以下信息:模型名称、该模型中的操作集、定义模型的位置、模型是否覆盖任何其他模型等。请确保已按照预期定义模型。
如果已为列生成自定义数据实用程序,请确保使用正确了的列。在 URL 上设置 jcaDebug=true,并检查列标题 DOM 元素,以确保列 id 符合您的预期。每列都具有以列 id 开头的标题文本,例如,默认操作列的标题文本类似于如下所示:“nmActions 验证者:...”。