使用 ltrim 和 rtrim 保存字符串



我正在尝试保存左端没有空格和右端没有空格的字符串。

从这两个网站,网站1和网站2。我开始使用 ltrim 和 rtrim 来删除空间。

在 xpage 中,有一个编辑框,它使用数据绑定绑定到一个名为 Topic 的表单,字段名称是 topic。还有一个按钮和一个计算字段。

这是 xpage 的完整代码。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1" formName="Topic"
computeWithForm="onsave">
</xp:dominoDocument>
</xp:this.data>
<xp:inputText id="inputText1" value="#{document1.topic}"></xp:inputText>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button value="Label" id="button1">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:var input = getComponent("inputText1").getValue();
var trimleft = input.ltrim();
var trimright = trimleft.rtrim();
getComponent("computedField1").setValue(trimright);
document1.save();
}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:text escape="true" id="computedField1"></xp:text>
</xp:view>

当我运行它时,我可以看到计算字段中输入的左端没有 sapce,输入右端没有空格。例如,如果我输入" this is test ",则计算字段可以显示结果,例如"This is testing"。

但是,在 Lotus Notes 客户端中,我打开视图,我注意到保存的输入具有空间(与原始输入相同)。

然后我尝试将自定义转换器放在编辑框中。代码是这样的

<xp:inputText id="inputText1" value="#{document1.topic}">
<xp:this.converter>
<xp:customConverter getAsString="#{javascript:value}">
<xp:this.getAsObject><![CDATA[#{javascript:var trimvalueleft = value.ltrim();
var trimvalueright = trimvalueleft.rtrim();
var value = trimvalueright;
value}]]></xp:this.getAsObject>
</xp:customConverter>
</xp:this.converter>
</xp:inputText>

我使用相同的输入"这是测试"再次运行它,我看到保存的输入仍然有空间。

之后,我打开表单,在字段中,我将@Trim(主题)放入输入翻译并再次运行,结果是一样的。

我不知道为什么即使我使用 rtrim 和 ltrim,保存的值仍然有空间。如果有人让我知道我的错误,请不胜感激。谢谢。

我会倾向于转换器,忘记复杂的保存操作。您也可以再次重新引用页面上的值,而无需手动设置。请尝试以下操作:

<xp:this.data>
<xp:dominoDocument var="document1" formName="Topic"
computeWithForm="onsave" />
</xp:this.data>
<xp:inputText id="inputTopic" value="#{document1.topic}">
<xp:this.converter>
<xp:customConverter getAsString="#{javascript:value}"
getAsObject="#{javascript:value.ltrim().rtrim()}" />
</xp:this.converter>
</xp:inputText>
<xp:br />
<xp:br />
<xp:button id="buttonSave" value="Save">
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete" action="#{javascript:document1.save()}" />
</xp:button>
<xp:br />
<xp:br />
<xp:text id="computedField1" escape="true" value="#{document1.topic}" />

我怀疑原因是您正在更新组件值(getComponent.setVaue()),但保存了数据源。仅当save()再次从所有组件中提取所有值时,这才有效。如果是这样的话,我会感到惊讶,并且可能会对性能产生很大的影响。

改为更新数据源(例如document1.replaceItemValue("myField",myValue))。仅当您无法访问其绑定到的数据源时(例如,在转换器/验证器中,因为数据源尚未更新)时才访问组件。

或者,由于您已经在执行 computeWithForm onsave,请在表单中使用 @Trim()。

最新更新