Как я могу получить `UIInput` из` ui: repeat` в SiteBean? - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь проверить несколько компонентов в ui:repeat.

Как мне получить UIInput из ui:repeat в SiteBean?

Код JSF:

    <f:event listener="#{siteBean.listenerMyListener}" type="preValidate" />
    <ez:inputText id="txtMY" required="true" value="Hallo" />

    <ui:repeat
        id ="myRepeat"
        var="item"
        value="#{siteBean.myList}"
        varStatus="status">

        <ez:panel style="margin-bottom: 7px; #{status.even ? 'background-color: #E6EFC2;' : 'background-color: #e5f1fa;'}">

            <h:messages for="hiddenValidation" />
            <h:inputHidden id="hiddenValidation" value="" />

            <h:outputText value="Rechnung vom:" />
            <ez:inputText id="txtDatum" value="#{item.datum}"
                          style="width: 100px; text-align: right;">
                <f:convertDateTime pattern="dd.MM.yyyy" />
            </ez:inputText>

            <br /><br />

            <h:outputText value="Netto:" />
            <ez:inputText id="txtNetto" required="true" value="#{item.netto}" style="width: 100px; text-align: right;">
                <f:convertNumber pattern="###0.00" />
                <f:validateBean />
            </ez:inputText>

            <br /><br />

            <h:outputText value="Brutto:" />
            <ez:inputText id="txtBrutto" required="true" value="#{item.brutto}" style="width: 100px; text-align: right;">
                <f:convertNumber pattern="###0.00" />
            </ez:inputText>

        </ez:panel>

    </ui:repeat>

Код боба:

public void listenerMyListener(ComponentSystemEvent event) {

    FacesContext context = FacesContext.getCurrentInstance();

    UIComponent components = event.getComponent();


    UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();


    UIInput search_txtMY = (UIInput) viewRoot.findComponent("frmMY:txtMY");
    String value_txtMY = search_txtMY.getLocalValue().toString(); // Hallo


    UIInput search_txtDatum = (UIInput) viewRoot.findComponent("frmMY:myRepeat:0:txtDatum"); // NULL
    String value_txtDatum = search_txtDatum.getLocalValue().toString(); // java.lang.NullPointerException  

}

1 Ответ

1 голос
/ 24 января 2012

<ui:repeat> - это не тег времени построения представления, а тег времени визуализации представления.В дереве представлений есть только один <h:inputText> компонент, обозначенный frmMY:myRepeat:txtDatum.Однако он отображается несколько раз, столько раз, сколько повторяется <ui:repeat>.Если вы использовали <c:forEach>, который является тегом времени построения представления, то в представлении действительно есть несколько <h:inputText> компонентов, каждый из которых отображается только один раз.

Необходимо решить проблему по-разному.,<c:forEach> может быть неправильным решением, поскольку может иметь неприятные «побочные эффекты», в зависимости от того, как спроектирован весь вид и модель.Поскольку функциональные требования не ясны, а необходимость сбора входных значений в прослушивателе системных событий не имеет никакого смысла (я не могу думать о каких-либо разумных реальных применениях этого подхода), я не могу предложить ничего, как решитьэто по-другому и правильно.Я догадываюсь , что вам просто нужен Validator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...