我想有条件地运行自定义转换器。我有一个XPages,可以处理同一页面上的编辑和新数据。用户选择了一个单选按钮来编辑或创建新项目。
输入字段在这两个函数之间共享。在页面加载时我不知道用户会做什么,所以我不能使用" Loaded"转换器的属性。
我需要以这种格式格式化数据' $ 900,000'。 请注意,我所需的格式没有分数。
数字或货币的内置转换器让我失望,因为无论我做什么,总是加分。我认为这是XPages中的一个错误。如果我说"只有整数"这并不重要。或将最大分数数字设置为零。美分不会消失。
我有一个适合我的自定义转换器,但只有在重新计算一次时才有效,而在重新计算时失败。我尝试将部分刷新更新设置为"不验证或更新数据"这样做有效,但打破了我需要启用更新的页面的其他部分。
这个应用程序很快就会被部署,对我来说,重新设计整个页面结构以解决这个问题为时已晚 - 太多的移动部件。所有我需要做的是取悦测试者它摆脱添加到值的美分(xxxx.00),并仍然有其他一切工作。
我的问题很奇怪,但我的问题是三方面的。我怎么能:
答案 0 :(得分:1)
因此,我最终使用验证器(也用于转换器的工作)。最重要的是,我使用组件的“绑定”(而不是值)来轻松访问同一页面上的其他字段。这允许条件检查/逻辑。如果您还没有尝试过组件绑定,那么会有一个great introduction by Tim Tripcony。
/约翰
答案 1 :(得分:1)
有两种方法可以做到这一点,一种方法是在自定义转换器中有条件地检查用户。另一种方法是使用PhaseListener并在RenderResponse阶段获取Component,并在组件上不需要它时将组件上的Converter设置为null。我通常不使用转换器,如果它只是显示数字,只是我实际上需要转换的值。我会使用类似于显示掩码的东西我最近使用了一个名为maskMoney的jquery插件,它可以很好地解决类似的问题。
答案 2 :(得分:1)
我认为您的转换器位于可编辑字段,因为否则它在提交数据时不会失败。
问题听起来是时机。转换器必须在页面加载期间运行,以便将存储在数据库中的Number值转换为浏览器所需的String值。因此需要设置一些默认值,这可能是为了连接它。
如果您想根据输入更改显示选项,则必须在输入后进行部分刷新,以便重新计算是否应出现美分
一旦输入的值从浏览器传回到底层组件树,您就可以相应地进行计算 - 只要您的转换器知道要与之交互的内容。他部分刷新的过程是恢复组件树,应用请求值(将浏览器中的String值存储到每个组件的submittedValue属性中),处理任何转换器或验证器,然后更新组件树。因此,当转换器运行时,单选按钮的值属性不会设置,因此它适用于上次刷新的设置 - 默认值。
选择"不要验证或更新数据"然后你说不要把任何输入的条目从浏览器写回到组件树中。所以我相信你可以这意味着转换器对所输入的内容一无所知。
John关于绑定的建议很好,但请记住,您需要相关组件的submittedValue属性。对于单选按钮,我不能100%确定它会是什么,但你应该能够打印出来。
掩码方法可能有效。最近有人使用它来使整数正常工作。
另一个选项是查看扩展库的Dojo数字验证文本框,它具有javaType属性和更灵活的转换器集。这可能会让你避免分数。如果确实如此,并且你不想要Dojo的外观和感觉,它的转换器应该提供一些关于你的转换器需要做些什么去除美分的想法。
答案 3 :(得分:1)
我无法得到上述任何答案,所以我克隆了文本框。我为“编辑”制作了一个节目,一个节目出现在“新节目”中。我保持一切相同,但只将自定义转换器添加到显示“编辑”的那个。
再次感谢您的帮助。 XPages社区摇滚!