Как обратиться к родителю dataTable в пределах dataTable? - PullRequest
5 голосов
/ 07 октября 2010

Рассмотрим фиктивный случай:

<h:form id="wrapperForm">
    <h:panelGroup id="rowsContainer">
        <h:dataTable id="rowsTable" value="#{bean.rows}" var="row" >
            <h:column>
                <h:commandButton value="Click me to update (#{component.parent.parent.parent.clientId})">
                    <f:ajax render=":#{component.parent.parent.parent.clientId}" />
                </h:commandButton>
            </h:column>
        </h:dataTable>
    </h:panelGroup>
</h:form>

При нажатии кнопки id=rowsContainer успешно обновляется, как и должно.

Однако, если я добавлю туда ui:repeat, это произойдет.больше не работает:

<h:form id="wrapperForm">
    <ui:repeat id="blocksRepeat" var="block" value="#{bean.blocks}">
        <h:panelGroup id="rowsWrapper">
            <h:dataTable id="rowsTable" value="#{block.rows}" var="row" >
                <h:column>
                    <h:commandButton value="Click me 2 update (#{component.parent.parent.parent.clientId})">
                        <f:ajax render=":#{component.parent.parent.parent.clientId}" />
                    </h:commandButton>
                </h:column>
            </h:dataTable>
        </h:panelGroup>
    </ui:repeat>
</h:form>

Вместо этого он получает:

<f:ajax> contains an unknown id ':wrapperForm:blocksRepeat:0:rowsWrapper' - cannot locate it in the context of the component j_idt363

Однако этот компонент действительно существует с этим идентификатором, поэтому EL должен быть в порядке.Каким-то образом ui:repeat ломает дело.Возможно, он пытается вычислить EL до фактического цикла?

Как вы ссылаетесь на элемент rowsWrapper из dataTable?

Примечание: я недавно спросил о нечетныхИменование таблицы данных в пользовательском интерфейсе: повтор , что оказалось ошибкой .Эта проблема не должна быть связана с этим, однако, поскольку я обертываю dataTable в PanelGroup, как предложено здесь .

1 Ответ

3 голосов
/ 11 октября 2010

На самом деле две вещи идут не так:

1) пользовательский интерфейс: повтор не работает

В ответе BalusC в комментариях к вопросу, первый выпускпроисходит (еще раз) из-за ошибки в Мохарре .Кажется, что ui:repeat настолько сломан, что даже контейнер-обертка, в котором находится h:dataTable, не помогает.Для получения более подробной информации см. Вопрос " Почему h: dataTable внутри пользовательского интерфейса: повторить получить правильный идентификатор? " и комментарии к этому вопросу.

Как предлагает BalusC, обходной путь заключается виспользуйте h: dataTable вместо ui:repeat.Это обеспечит неудобный (<table>) HTML, но работает.Это устраняет некоторые странные проблемы при добавлении и удалении строк в / из внутренней итерации.

Примечание: некоторые проблемы, связанные с ui:repeat, кажутся исправленными в Mojarra 2.0.3, но не все.

2) Ссылки просто терпят неудачу

Даже при обходном пути h:dataTable ссылка на внутренний h:dataTable от кнопки внутри него не срабатывает.Поскольку ui:repeat не используется, это, должно быть, внутренняя проблема с данными.На данный момент я не вижу никакого решения, поэтому я также подал заявку на это поведение .

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