具有输入行的数据表

时间:2009-05-18 16:33:00

标签: jsf datatable rows input

我有一个生成文本输入和选择列表行的数据表,当我提交时,值为null。我意识到这是因为jsf为每个输入生成单独的随机ID。我真的需要按行显示数据,然后解析出我需要的内容。有什么建议吗?:

<h:dataTable id="returnableItems" value="#{returnableItemsBean.orderCustomerFamilyItems}" var="item" styleClass="data stripeTable center">
  <h:column>
    <f:facet name="header">Item Number</f:facet>
    <h:outputText id="itemNum" value="#{item.itemNum}"/>
  </h:column>
  <h:column>
    <f:facet name="header">Description</f:facet>
    <h:outputText value="#{item.itemDescription}"/>
  </h:column>
  <h:column>
    <f:facet name="header">Original Quantity</f:facet>
    <h:outputText value="#{item.originalQuantity}"/>
  </h:column>
  <h:column>
    <f:facet name="header">Remaining Quantity</f:facet>
    <h:outputText value="#{item.eligibleQuantity}"/>
  </h:column>
  <h:column>
    <f:facet name="header">Quantity For Return</f:facet>
    <h:panelGrid styleClass="stepper">
      <span class="ns ui-stepper">
        <input id="returnQuantity" type="text" name="returnQuantity" size="2" autocomplete="off" class="ui-stepper-textbox" value="0" />
        <button type="button" name="ns_button_1_0" value="" class="ui-stepper-plus" onclick="setMaxVal(this,#{item.eligibleQuantity});">+</button>
        <button type="button" name="ns_button_2_0" value="" class="ui-stepper-minus">-</button>
      </span>
    </h:panelGrid>
  </h:column>
  <h:column>
    <f:facet name="header">Reason for Return</f:facet>
    <h:selectOneMenu id="returnReason" value="#{returnableItemsBean.orderReason.ordReasonCode}">
      <f:selectItems value="#{returnableItemsBean.orderReasons}"/>
      <f:converter  converterId="orderReasonConverter"/>
    </h:selectOneMenu>
  </h:column>
  <h:column>
    <f:facet name="header">Return/Replacement</f:facet>
    <h:selectOneMenu id="returnOption">
      <f:selectItem itemLabel="Option" itemValue=""/>
      <f:selectItem itemLabel="Return" itemValue="return"/>
      <f:selectItem itemLabel="Replacement" itemValue="replacement"/>
    </h:selectOneMenu>
  </h:column>
</h:dataTable>

2 个答案:

答案 0 :(得分:2)

我无法理解为什么在表单中使用HTML输入和按钮而不使用JSF。请改用<h:inputText><h:commandButton>,并将它们的值绑定到辅助bean中的属性。当然,整个表格应该在<h:form> ... </h:form>标签内。

此外,您的输入应该绑定到“item”变量的属性,就像输出一样。如果没有,每行将有一个输入绑定到您的支持bean的相同属性。

您使用的是JSP还是Facelets?

答案 1 :(得分:0)

  

jsf为每个输入生成单独的随机ID

ID不是随机的; h:dataTable NamingContainer并管理其子级clientId,因此它们变得独一无二(HTML规范的要求)。 JSF:working with component IDs (id vs clientId)

您添加的直接HTML将难以与JSF模型 - 视图 - 展示器框架集成。坚持JSF控件会更好。此代码显示了如何使用JavaScript和custom TLD function

操作客户端字段值
  <h:dataTable value="#{rowDataBean.data}" var="row">
    <h:column>
      <f:facet name="header">
        <h:outputText value="product" />
      </f:facet>
      <h:outputText value="#{row.name}" />
    </h:column>
    <h:column id="column2">
      <f:facet name="header">
        <h:outputText value="quantity" />
      </f:facet>
      <h:inputText id="quantityCount" value="#{row.quantity}" />
      <h:commandButton value="+"
        onclick="increment('#{id:clientId('quantityCount')}'); return false;" />
    </h:column>
  </h:dataTable>

调用的JavaScript:

function increment(id) {
  //TODO: error handling
  var textField = document.getElementById(id);
  var value = textField.value;
  value++;
  textField.value = value;
}

如果您使用的是Facelets而不是JSP,则需要在Facelets tag library中定义该函数。