Заполнение inputTextArea содержимым из нескольких selectOneMenus и кнопок - PullRequest
3 голосов
/ 13 октября 2011

Я хочу создать небольшой пользовательский интерфейс, который предоставит пользователю возможность писать некоторые математические формулы более простым способом (следовательно, пользовательский интерфейс) и сможет сохранять их в .txt (или что-то подобное) файл.

Например: у меня есть 3 поля выбора, которые предлагают различные варианты, некоторые кнопки, которые представляют математические операции, и inputTextArea. До сих пор мне удавалось связать выбранный контент из каждого selectOneMenu и нескольких inputText и связать их с тем, что мне нужно, и записать созданные математические формулы в файл .txt.

Теперь я хочу предложить пользователю возможность увидеть формулу, которую он пишет (выбирая контент и нажимая кнопки), как он это делает. До сих пор я пытался сделать это с помощью inputTextArea, но лучшее, что мне удалось, - это перенести выбранный контент из только одного selectOneMenu в textArea и после этого все мои попытки добавить каждое действие, которое выполняет пользователь к текстовой области не удалось (кто-то предложил использовать <h:panelGroup>, но я с этим не справился, я попытался объединить все компоненты, которые я использовал, чтобы заполнить меню, в один компонент и как-то перейти оттуда, но это тоже не сработало) .

Образец части 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 дней назад), поэтому я буду признателен даже за то, что мне указывают на некоторую документацию, которая может охватывать эту или подобные проблемы.

1 Ответ

0 голосов
/ 13 октября 2011

Вы в основном злоупотребляете valueChangeListener здесь.Вас не совсем интересует изменение значения (т. Е. Вас не интересует и старого и нового значения), вас интересует только представленное значение.Это допускалось в JSF 1.x, когда вы не / не можете / не будете использовать библиотеку компонентов на основе ajax.Существуют (довольно сложные) способы исправить вашу конкретную проблему с помощью 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} бин должен быть помещен в область видимости на @ViewScoped.Никаких дополнительных методов прослушивания не требуется.Только если вы когда-нибудь захотите манипулировать значениями перед его отображением, вам нужен слушатель ajax.Например,

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...