2008-11-25 30 views
5

Có một vấn đề nhỏ với ứng dụng Seam tôi đang làm việc và tôi đã tự hỏi liệu có ai biết cách làm tròn nó không. Tôi đã có một hình thức trong ứng dụng của tôi có sử dụng AJAX để hiển thị một số hộp đầu vào tùy thuộc vào một mục trong một hộp thả xuống. Mã hoạt động tốt ngoại trừ việc đặt ID trong hộp nhập liệu của tôi. Có vẻ như JSF không cho phép tôi đặt ID thông qua một biến. Các thuộc tính khác như "for" trong nhãn là tốt. Dưới đây là một số mã giải thích những gì tôi muốn nói:Id động trong JSF/Seam

<ui:repeat value="#{serviceHome.instance.serviceSettings}" var="currSetting" > 
    <li> 
    <!-- Imagine the below works out as "settingABC" --> 
    <c:set var="labelKey" value="setting#{jsfUtils.removeWhitespace(currSetting.key.name)}" /> 

    <!-- Labelkey is correctly added into this input so for = "settingABC" --> 
    <h:outputLabel for="#{labelKey}" styleClass="required generated" value="#{currSetting.key.name}:"/> 

    <s:decorate styleClass="errorwrapper"> 

     <!-- Labelkey ISN'T correctly added into this input. Instead we just get "setting" --> 
     <h:inputText id="#{labelKey}" value="#{currSetting.value}"/> 

     <a4j:outputPanel ajaxRendered="true"> 
     <h:message for="#{labelKey}" styleClass="errormessage" /> 
     </a4j:outputPanel> 
    </s:decorate> 
    </li> 
</ui:repeat> 

Có ai có bất kỳ ý tưởng làm thế nào tôi có thể vượt qua điều này?

Trả lời

8

Bạn thấy lý do tại sao họ không cho phép bạn đặt ID, đúng không? JSF tiếp quản việc tạo id bởi vì bạn đang ở trong một vòng lặp lặp lại của các thành phần và, nếu chúng cho phép bạn chỉ đặt id, bạn sẽ kết thúc với các ID trùng lặp, điều này sẽ không giúp bạn.

Không biết TẠI SAO bạn muốn đặt ID rõ ràng, thật khó để giải quyết vấn đề cho bạn. Nếu nó cho JavaScript, bạn có thể làm những gì Grant Wagner gợi ý, và để JSF cung cấp cho bạn những gì nó đặt làm id. Bạn cũng có thể mất một peek tại HTML được tạo và xem những gì định dạng id là trong. JSF thường sử dụng

"form_id:loop_id:loop_index:component_id" 

như id nó tạo ra cho các thành phần trong một hình thức/lặp lại. Bạn phải chắc chắn và cung cấp id cho biểu mẫu của bạn và ui: lặp lại các thẻ để biết chúng là gì.

Ok, bạn đã trả lời rằng bạn muốn có thẻ h: message cho một inputText cụ thể trong vòng lặp, thật dễ dàng.

<h:inputText id="myInput" .... /> 
<h:message for="myInput" ... /> 

Bây giờ, thư được tạo cho đầu vào sẽ được hiển thị trong thư và JSF sẽ mang thuộc tính "cho" (mặc dù không được tạo HTML) giống như thuộc tính "id" inputText để chúng khớp nhau.

Bạn thậm chí có thể tạo các tin nhắn OWN trong mã trình xử lý của mình để chuyển đến thông điệp h cụ thể, nhưng bạn sẽ cần sử dụng cuộc gọi đến clientId để nhận được đích của thông báo, cho bean sao lưu (không phải giá trị bean sao lưu) của thành phần được đề cập.

+0

Rất tiếc. Tôi rời khỏi điều này trong một thời gian không I. Tôi hiểu tại sao tôi không thể gán ID trong một vòng lặp nhưng tôi biết những gì tôi đang thiết lập như ID (labelKey) sẽ là duy nhất cho mỗi lần lặp qua vòng lặp. –

+0

Đối với những gì tôi muốn đạt được, tôi muốn biết một cách tôi có thể liên kết h: inputText & h: tin nhắn với nhau trong vòng lặp. Vì vậy, nếu một số xác nhận không thành công trên văn bản đầu vào, tôi có thể gặp lỗi trong hộp thư có liên quan của nó. –

+0

Tôi nghĩ rằng tôi có thể chỉ cần làm điều đó một cách khác nhau và chỉ cần có một thông điệp chung cho tất cả các lĩnh vực được hiển thị/tạo ra trên sự thay đổi thả xuống. Xin lỗi về nhiều nhận xét - Không thể phù hợp với tất cả trong 300 ký tự! –

3

Tôi giả sử bạn muốn kiểm soát ID của thành phần đầu vào của mình để bạn có thể tham chiếu sau trong Javascript?

Vì bạn không thể thiết lập ID thông qua một biểu thức, tôi làm điều này:

<h:inputText id="whatever" value="..." /> 

Rồi sau đó trong các mã:

<script type="text/javascript"> 
var theElement = document.getElementById('<h:outputText value="#{pagecode.whateverClientId}"/ >'); 
... 
</script> 

Trong pagecode:

protected HtmlInputText getWhatever() { 
    if (whatever == null) { 
     whatever = (HtmlInputText) findComponentInRoot("whatever"); 
    } 
} 

public String getWhateverClientId() { 
    return getWhatever().getClientId(getFacesContext()); 
} 

Hy vọng rằng sẽ giúp.

+0

Tôi có một vấn đề tương đương. Câu trả lời của bạn không trực tiếp giải quyết nó, nhưng nó cho tôi một gợi ý hữu ích. Đôi khi, ngay cả một gợi ý có thể cứu sống. Cảm ơn;) – hirikarate

0

Bạn đã thử dùng facelets chưa?

Điều đó sẽ cho phép bạn assing id của riêng bạn tức là:

tôi: sau đó labelKeyThingo có thể sử dụng id = # {labelKey} để làm cho một nhãn đặc biệt.Dưới đây là một ví dụ facelet gọi m: textPassword từ mã xấu của tôi:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:c="http://java.sun.com/jstl/core" xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich"> 

    <ui:composition> 

    <c:set var="styleClass" value="formPrompt" /> 
    <c:set var="requiredLabel" value="" /> 
    <c:choose> 
     <c:when test="${required=='true'}"> 

      <c:set var="required" value="true" /> 
      <c:set var="styleClass" value="formRequiredPrompt" /> 
      <c:set var="requiredLabel" value="*" /> 
     </c:when> 
    </c:choose> 

    <h:panelGroup id="#{id}_formRowTemplateLabel_panelGroup"> 
     <h:outputLabel for="#{id}" styleClass="#{styleClass}" id="#{id}_formRowTemplate_outPut" 
      value="#{label}" /> 
     <c:if test="${required == 'true'}"> 
      <h:outputText value="#{requiredLabel}" styleClass="formRequiredPromptAsterix"></h:outputText> 
     </c:if> 
    </h:panelGroup> 

    <h:panelGroup id="#{id}_textPasswordTemplate_panelGroup"> 
     <h:inputSecret required="${required}" id="#{id}" value="#{property}" 
      styleClass="formText"> 

      <f:validator validatorId="Maserati.Password" /> 
      <f:validateLength maximum="16" minimum="8" /> 
      <ui:insert name="additionalTags"></ui:insert> 
     </h:inputSecret> 

     <h:message styleClass="formErrorMsg" id="#{id}_textPasswordTemplate_msg" for="#{id}" /> 
    </h:panelGroup> 

    </ui:composition> 

    </html> 

Nó được sử dụng thusly:

<m:textPassword id="password" label="#{msgs.passwordPrompt}" 
property="#{individualApplicationMBean.password}" 
required="true" maxlength="16" /> 
Các vấn đề liên quan