哪种方式是访问控件值最有效的方法?

6

在我需要访问控件值时,哪种方式更高效?

getComponent("ControlName").getValue();

或者

dataSource.getItemValue("FieldName");

我发现有时候 getComponent 并不能返回当前值,但是访问 dataSource 似乎更加可靠。那么从性能角度来看,使用哪一个有很大的区别吗?
我尝试过在任何地方使用 dataSource.getValue 都可以正常工作。然而,当与 rowData 一起使用时,我仍然需要使用 rowData.getColumnValue("Something")rowData.getValue("Something") 会失败。

你从组件和数据源获取的值的类型可能不同。 - Frantisek Kossuth
2个回答

17

最快的语法是dataSource.getValue("FieldName")。而getItemValue方法只适用于文档数据源,而getValue方法不仅可以在通过视图数据源访问的视图条目上使用(尽管在这种情况下,您需要将程序化名称传递给视图列,这不一定与字段名称相同),而且还可用于您开发或安装的任何自定义数据源(例如第三方扩展库)。此外,它执行自动类型转换,如果使用getItemValue,则必须自行执行。

即使在非常简单的页面上,dataSource.getValue("FieldName")的速度也比getComponent("id").getValue()快5倍,因为像Fredrik提到的那样,首先要“查找”组件,然后询问它的值...在幕后,这只是向数据源询问。所以,直接询问数据源自己总是更快的。

注意:对应的写方法是dataSource.setValue("FieldName", "NewValue"),而不是dataSource.replaceItemValue("FieldName", "NewValue")。两者都可以工作,但setValue也执行与getValue相同的类型转换,因此可以传递不严格符合旧Domino Java API的数据,它通常会自动找出需要将值转换为什么才能“安全”地存储在Domino中。


谢谢,这真的很重要。我有一个XPage,可以进行此类查找。现在回到代码中,找到所有使用此方法的地方并更改它们。这是一篇我复制到我的备忘录文档中以供将来参考和提醒的帖子。很多时候,最明显的方法远非最好的方法。 - Bill F
这里是一些后续内容。在重复控件中,我通过将计算字段绑定到rowData中的字段来显示rowData的值。我猜rowData.getValue会更快? - Bill F
啊 - 开发中非常宝贵(双关语)的最佳实践:永远不要追随后备元素/物品,坚持使用数据源。 - stwissel

4

我认为最有效的方法是直接从数据源获取值。因为如果你使用getComponent("ControlName").getValue();,你首先要对组件进行get操作,然后再从中获取值。所以在我看来,从数据源进行单次获取更加高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接