Частичное отображение избыточного вызова метода - PullRequest
3 голосов
/ 16 декабря 2011

Мне известно, что JSF может вызывать метод управляемого компонента несколько раз, даже если он вызывается только один раз в .xhtml. Я понимаю, что это связано с * методы.

Я хотел бы попросить вас объяснить мне следующий случай. У меня есть файл JSF, который выглядит примерно так:

<h:form id="form1">
    <h:panelGroup id="output">
        ...
        <h:commandLink...>
            <f:ajax render=":form1:output"/>
        </h:commandLink>
    </h:panelGroup>
</h:form>

Пока все ясно; нажатие на ссылку команды переопределяет часть страницы в форме панели группы. Код следует:

<ui:repeat value="#{movieBean.categories}" var="category">
    <li>
        <h:outputLink value="index.xhtml">
            <f:param name="categoryId" value="#{category.categoryId}"/>
            <h:outputText value="#{category.description}"/>
        </h:outputLink>
    </li>
</ui:repeat>

#{movieBean.categories} //this is just a 'test line'

movieBean - область запроса.

Теперь, когда я вхожу на страницу в первый раз, я получаю два звонка в movieBean.categories. Это понятно, потому что он вызывается дважды в коде. Тем не менее, когда я нажал AJAX-рендеринг ссылки только часть страницы (вывод), я получаю movieBean.categories из <ui:repeat>, вызываемую еще раз хотя он находится за пределами частично визуализированной области страницы. «Тестовая линия» на этот раз не вызывается.

Я провел еще один тест. Я удалил тег <ui:repeat>, оставив только «тестовую строку». Частичный рендеринг AJAX не называет его как прежде.

Что отличает вызов movieBean.categories внутри тега <ui:repeat> чем тот, что в «тестовой линии»? И почему звонок внутри <ui:repeat> осуществляется при нажатии на ссылку AJAX? несмотря на то, что он снаружи частично отображается <h:panelGroup id="output"/> тег?

1 Ответ

3 голосов
/ 16 декабря 2011

Я почти уверен, что «избыточный» вызов выполняется на этапе, когда JSF перестраивает дерево элементов для хранения данных POST в соответствующих элементах.

Таким образом, если вы остаетесь настраница.Сначала нужно сохранить новые значения формы, затем отобразить содержимое страницы.

...