我想构建一个小UI,它将为用户提供以更简单的方式编写一些数学公式的可能性(因此UI),并能够将它们保存到.txt(或类似的)文件中。
例如:我有3个选择框,提供各种选项,一些代表数学运算的按钮和一个inputTextArea。到目前为止,我已设法链接每个selectOneMenu和几个inputText中的选定内容,并将它们与我需要的内容连接起来,并将创建的数学公式写入.txt文件。
现在我想让用户可以看到他正在编写的公式(通过选择内容并按下按钮)。到目前为止,我一直在尝试使用inputTextArea来做到这一点,但我管理的最好的方法是将所选内容从只有一个 selectOneMenu传输到textArea,然后我尝试将所有操作添加到用户使文本区域失败(有人建议使用<h:panelGroup>
,但我无处可去,我试图将我用来填充菜单的所有bean组合成一个bean,并以某种方式从那里开始,但是没有工作要么)。
到目前为止我一直在研究的JSF部分样本,包含2个选择框和TextArea:
<h:outputText value="Formula Name"></h:outputText>
<h:inputText value="#{output.formulaName}" id="formulaName"></h:inputText>
<br /><br />
The formula so far:
<h:inputTextarea value="#{output.propertyReferenceValue}"></h:inputTextarea>
<br/><br/><br/>
Property1:
<h:selectOneMenu value ="#{output.propertyReferenceValue}" id="selectTwo"
valueChangeListener="#{output.propertyReferenceValueChanged}" onchange="submit()">
<f:selectItems value="#{property.propertyReference}"/>
</h:selectOneMenu>
<br/><br/>
Property2:
<h:selectOneMenu value ="#{output.property2ReferenceValue}" id="selectThree"
valueChangeListener="#{output.property2ReferenceChangedValue}" onchange="submit()">
<f:selectItems value="#{property2.property2Refference}" />
</h:selectOneMenu>
任何帮助将不胜感激。
PS。我是JSF的新手(大约2天前开始),所以即使被指出可能涉及这个或类似问题的一些文档,我也会感激。
答案 0 :(得分:0)
你基本上在这里滥用valueChangeListener
。您对价值变化并不完全感兴趣(即您对两者旧价值和新价值不感兴趣),您只对提交的价值感兴趣。当你没有/不能/不会使用基于ajax的组件库时,这在JSF 1.x中是可以容忍的。有(相当复杂)的方法可以用valueChangeListener
修复你的特定问题,但在JSF 2.x中,它带有内置的ajax功能,这实际上不能再用这种方式了。您应该使用<f:ajax>
标记来引入异步提交和部分更新。
重写您的观点如下:
Formula name:
<h:inputText value="#{output.formulaName}" id="formulaName" />
<br/><br/>
The formula so far:
<h:inputTextarea id="formula" value="#{output.propertyReferenceValue}#{output.property2ReferenceValue}"></h:inputTextarea>
<br/><br/>
Property1:
<h:selectOneMenu value="#{output.propertyReferenceValue}" id="selectTwo">
<f:selectItems value="#{property.propertyReference}"/>
<f:ajax render="formula" />
</h:selectOneMenu>
<br/><br/>
Property2:
<h:selectOneMenu value ="#{output.property2ReferenceValue}" id="selectThree">
<f:selectItems value="#{property2.property2Refference}" />
<f:ajax render="formula" />
</h:selectOneMenu>
这就是全部。您的#{output}
bean应放在@ViewScoped
的视图范围内。不需要addidional listener方法。只有当你想在显示它之前操纵它们时,你需要一个ajax监听器。 E.g。
Formula name:
<h:inputText value="#{output.formulaName}" id="formulaName" />
<br/><br/>
The formula so far:
<h:inputTextarea id="formula" value="#{output.formula}"></h:inputTextarea>
<br/><br/>
Property1:
<h:selectOneMenu value="#{output.propertyReferenceValue}" id="selectTwo">
<f:selectItems value="#{property.propertyReference}"/>
<f:ajax listener="#{output.calculateFormula}" render="formula" />
</h:selectOneMenu>
<br/><br/>
Property2:
<h:selectOneMenu value ="#{output.property2ReferenceValue}" id="selectThree">
<f:selectItems value="#{property2.property2Refference}" />
<f:ajax listener="#{output.calculateFormula}" render="formula" />
</h:selectOneMenu>
例如(这个启动示例对逗号进行了简单的连接,但您可以完全自由地按照自己的方式构建formula
值):
public void calculateFormula() {
formula = propertyReferenceValue + ", " + property2ReferenceValue;
}