2010-02-03 5 views
2

Когда я включаю атрибут «disabled» в a4j: commandButton, действие кнопки не выполняется. Принятие атрибута «disabled» заставляет его работать правильно. Я не делаю специальной проверки (что я знаю), и я не вижу сообщений об ошибках проверки.JSF a4j: commandButton не работает, когда установлен «отключен»

Вот часть моей страницы:

<t:dataTable id="myTable" 
      var="region" 
      value="#{MyPageBackingBean.regions}" 
      width="100%"> 

... 

<a4j:commandButton value="Update" 
        action="#{region.doUpdate}" 
        oncomplete="alert('done');" 
        disabled="#{!empty region && region.messageEmpty}" 
        immediate="true"/> 

... 

</t:dataTable> 

Любые идеи? Благодаря!

Edit:

Я попытался установить preserveDataModel = "истина" на т: DataTable безрезультатно.

Я также сделал тест, имеющий a4j: CommandButton и текстовое поле без каких-либо данных таблицы, но действие поддержка боба еще не увольняют:

 <h:form> 
    <a4j:region> 
     <a4j:outputPanel id="testregion"> 
     <h:messages id="messages"/> 

          <a4j:status> 
          <f:facet name="start"> 
           <h:graphicImage value="/images/progress_indicator.gif"/> 
          </f:facet> 
          </a4j:status> 

         <h:inputTextarea 
          rows="5" 
          value="#{MyPageBackingBean.myValue}" 
          style="width:100%; border: 1px solid #99CCFF;"> 
          <a4j:support event="onkeyup" 
             reRender="testregion" 
             eventsQueue="messageModificationQueue" 
             ignoreDupResponses="true" 
             requestDelay="500"/> 
         </h:inputTextarea> 

         <a4j:commandButton id="doDelete" 
              value="Delete" 
              action="#{MyPageBackingBean.dummy}" 
              reRender="testregion" 
              disabled="#{empty MyPageBackingBean.myValue}"/> 
        <h:outputText value="#{MyPageBackingBean.myValue}"/> 
     </a4j:outputPanel> 
    </a4j:region> 
    </h:form> 

Вот новый код защитный боб используется для тестирования :

private String m_myValue = null; 
    public String getMyValue() 
    { 
     return m_myValue; 
    } 
    public void setMyValue(String value) 
    { 
     m_myValue = value; 
    } 
    private String mystr2 = null; 
    public String dummy() 
    { 
     mystr2 = "hello"; 
     return null; 
    } 

Спасибо!

+0

Вы проверили, не отключено ли значение отключено до значения true? – Bozho

+0

Логика проста, поэтому она должна оцениваться как истина, но я не проверял ее явно. Вы знаете, где я могу? Я использую IntelliJ 8 и JBoss 5. –

ответ

5

В HTML мире атрибут disabled вызывает name - атрибут пары value любого HTML элемента ввода (input, select, textarea и button) не отправляется на стороне сервера.

В мире JSF наличие атрибута name используется для идентификации действия компонента, которое необходимо вызвать на стороне сервера. Тем не менее, во время применения запрашиваемых значений фаза представления формы JSF также проверяет, отвечает ли атрибут disabled (и) компонента true перед выполнением каких-либо действий.

#{region} здесь повторный столик объект ряда #{MyPageBackingBean.regions} которого isMessageEmpty() геттера по умолчанию возвращает true. В новом запросе формы отправьте #{MyPageBackingBean.regions}, по-видимому, пустой, который эффектно делает кнопку disabled. Тогда JSF не будет ссылаться на связанное действие.

К тому же, вы должны убедиться, что #{MyPageBackingBean.regions} возвращает тот же самый datamodel в последующем запросе. Самое простое исправление состоит в том, чтобы поместить фазу MyPageBackingBean в область сеанса, чтобы она не была повторно инициализирована в последующем запросе, но имеет и более отрицательные побочные эффекты. Другое исправление заключается в том, чтобы переставить загрузку данных, чтобы это произошло в конструкторе bean. Поскольку вы уже используете Tomahawk's <t:dataTable>, вам необходимо установить его атрибут preserveDataModel на true. Для получения дополнительных рекомендаций по использованию данных можно найти эту статью полезной: Using Datatables.

+0

Спасибо за информацию, я обязательно попробую это. Бьюсь об заклад, часть моей проблемы может заключаться в том, что MyPageBackingBean имеет область запроса. Может быть, preserveDataModel поможет. –

+0

Нет такой удачи с preserveDataModel или перемещение командной строки и текстового поля из данных (см. Мой отредактированный вопрос). Бэк-бэк - это область запроса, хотя это может быть проблемой. Есть предположения? –

+0

Возможно, это плохо работает с аяксическими запросами. Я не делал a4j экстенсивно, поэтому я не могу гарантировать работу, но теоретически используя '' в конкретном компоненте, обработанном объектом, должен исправить эту проблему. – BalusC

1

Еще одно замечание об отключенном свойстве для a4j: commandButton: если для свойства disabled установлено значение true, то хук ajax для события onclick кнопки никогда не отображается в конечном HTML.То есть, вы получите кнопки, как это:

<input type="button" onclick="return false" ... /> 

вместо этого:

<input type="button" onclick="A4J.AJAX.Submit('....');return false" ... /> 

Так что, если вы хотите сделать что-то вроде этого:

  1. Визуализировать страницу с отключенной a4j : button
  2. Включить кнопку a4j: на стороне клиента на основе взаимодействия пользователя
  3. Нажмите на кнопку a4j: to ca Л.Л. сторона сервер действие

Тогда вы вместо этого нужно сделать что-то вроде этого:

  1. Рендера страницы с a4j: кнопкой и инвалидами = «# {TRUE}»
  2. Have спускового механизма взаимодействия с пользователем повторное рендер a4j: кнопка с отключенным = «# {ложь}»
  3. Нажмите на a4j: кнопка для вызова на стороне сервера Действие

Вот простой пример:

<h:selectOneCheckbox value="#{myAction.booleanProperty}"> 
    <a4j:support event="onclick" reRender="button1" /> 
</h:selectOneCheckbox> 
<a4j:commandButton id="button1" action="#{myAction.doSomething}" 
    disabled="#{myAction.booleanProperty eq false}" value="click me" 
/> 
+0

Интересно, спасибо за информацию! –

+0

@drteeth, я просто протестировал ваше решение, но он все еще удаляет события – jasalguero

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