2010-09-27 2 views
1

Я разрабатываю приложение Java EE (JSF2 + richfaces 3.3.3 + facelets).Как отключить/повторно включить компонент JSF с помощью javascript?

Я хочу отключить мой h: selectOneMenu при загрузке моей страницы, и когда он заканчивает загрузку (используя функцию onload()), я хочу снова включить мой компонент. у меня есть что-то вроде этого:

<ui:define name="infosHead"> 
    <script type="text/javascript"> 
     window.onload = function() { 
      document.getElementById("forme1_myform:valueCh").disabled = false; 
      alert("here"); 
     } 
    </script> 
</ui:define> 
<ui:define name="infosBody"> 
    <h:form id="forme1_myform" target="_blank"> 
    <h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="true" > 
     <f:selectItems value="#{mybean.values}" /> 
     <a4j:support event="onchange" 
       ajaxSingle="true" 
       limitToList="true"      
       reRender="id1,id2,...." 
       ignoreDupResponses="true" 
       action="#{mybean.actionme}" 
       oncomplete="getId();"/> 
     </h:selectOneMenu> 
    </h:form> 
</ui:define> 

это работает нормально. Но мой боб ничего не получает (mybean.value == null).

Как будто он считает, что компонент по-прежнему отключен.

Как я могу это сделать?

+0

это работало без функции? можете ли вы опубликовать код компонента? – Dejell

+0

Включение и отключение компонента работает. Но получение значения элемента, который я выбираю из моего списка, работает дон. Когда я устанавливаю атрибут disabled из моего h: selectOneMenu в false, тогда я получаю значение выбранного элемента. – mohamida

ответ

0

Я нашел это решение.

<ui:define name="infosHead"> 
    <script type="text/javascript"> 
     window.onload = function() { 
      updateName(false); // sets 'disabled' from true to false 
     } 
    </script> 
</ui:define> 
<ui:define name="infosBody"> 
    <h:form id="forme1_myform" target="_blank"> 
    <h:selectOneMenu id="valueCh" value="#{mybean.value}" disabled="#{mybean.render}" > 
     <f:selectItems value="#{mybean.values}" /> 
     <a4j:support event="onchange" 
       ajaxSingle="true" 
       limitToList="true"      
       reRender="id1,id2,...." 
       ignoreDupResponses="true" 
       action="#{mybean.actionme}" 
       oncomplete="getId();"/> 
     </h:selectOneMenu> 
    </h:form> 
    <a4j:form> 
     <!-- this is where it's going to reRender my component --> 
     <a4j:jsFunction name="updateName" reRender="valueCh"> 
      <a4j:actionparam name="param1" assignTo="#{mybean.render}" /> 
     </a4j:jsFunction> 
    </a4j:form> 
</ui:define> 

и это содержание mybean:

public class MyBean implements Serializable { 

    private List<SelectItem> values; 
    private String value; 
    private Boolean render = true; // the page loads with element disabled 

    public void actionme(){...} 
    //getters & setters 
} 
4

Проблема заключается в том, что вы включаете свой компонент только на стороне клиента. На стороне сервера всегда будет disabled="true". Для выполнения этой работы вы должны:

a. Назначает отключенное свойство компонента в управляемой фасоли собственности, которая будет первоначально «истиной»

disabled="#{myController.valueChDisableStatus}"

б. Внутри вашего h: form insert window.onload = callScript

c. Наконец, в методе установить значение valueChDisableStatus на значение false

Я не могу проверить решение прямо сейчас, но я считаю, что он будет работать нормально.

0

Ни один из этих решений не работал для меня.

При установке атрибута отключенного элемента из управляемого управляемого компонента работа выполнена нормально, а изменение его значения с помощью javascript также отлично работает, как только форма отправлена, метод «someaction» все еще не достигнут, чтобы «установить свойство valueChDisableStatus to false ". Кроме того, я обнаружил, что хотя мой управляемый bean-компонент имел isDisabled() и setDisabled (логическое значение), метод setDisabled() никогда не вызывался после отправки формы (конечно), хотя isDisabled() был. Поэтому мне не удалось найти способ использовать эти решения, чтобы изменить значение «disabledElement» управляемых компонентов на false.

Я нашел решение, которое сделал работу для меня, хотя по этой ссылке: http://blog.michaelscepaniak.com/jsf-you-cant-submit-a-disabled-form-element

В основном это означает, что по умолчанию все элементы должны быть «включено» с точки зрения JSF, и что все включения и выключения должно выполняться через Javascript. Он указывает, что состояние клиента и сервера временно не синхронизируется в этом решении ... но оно отлично работает для моего сценария, независимо от временного несоответствия.

+0

Вы и автор блога, похоже, не понимаете, что JSF делает это как часть защиты от подделанных запросов от хакеров. См. Также a.o. http://stackoverflow.com/q/11409823, http://stackoverflow.com/q/9000669 и №5 http://stackoverflow.com/q/2118656 Возможно, это менее вредно для вашего конкретного случая, но это серьезное защитное отверстие, когда условие зависит от, например, роль/группа пользователя вошедшего в систему. – BalusC

Смежные вопросы