a4j: выходная панель ReRender не работает - PullRequest
1 голос
/ 14 июля 2011

У меня есть a4j: outputPanel, который отображается на основе некоторого логического условия:

<a4j:outputPanel id="someDisplayRegion" rendered="#{doc.ready &amp;&amp someClass.someBooleanMethod}"> 
    // bunch of stuff //
</a4j:outputPanel>

Затем на той же странице .xhtml у меня есть раскрывающееся меню, и выбор одного из его вариантов должен повторно отобразить вышеуказанный регион:

<rich:dropDownMenu>                                         
    <f:facet name="label">                                            
        <a4j:commandLink styleClass="btn-pulldown">                                             
            <span><h:outputText value="Export"></h:outputText></span>                                                       
            <span class="opener"></span>                                              
        </a4j:commandLink>                                        
    </f:facet>                                              

    <rich:menuItem  submitMode="none">                                                 
        <s:link                                                 
            rendered="#{someOtherBooleanMethod}"                                    
            value="#exportDoc"                                              
            action="#{runSomething.exportDoc()}"                                                
            reRender="someDisplayRegion"                                                
            target="downloadfile"                                                
       ><s:conversationId /></s:link>                                          
    </rich:menuItem>                                                                                 
</rich:dropDownMenu>

Однако, когда я щелкаю по пункту меню из выпадающего меню, он не переходит в someClass.someBooleanMethod и, следовательно, не перерисовывается someDisplayRegion. Я что-то не так делаю?

Ответы [ 4 ]

4 голосов
/ 15 июля 2011

Рассмотрим этот пункт документации RichFaces:

Как и в большинстве сред Ajax, вы не должны пытаться добавлять или удалять элементы на странице, используя RichFaces Ajax, а вместо этого должны заменять их.Таким образом, элементы, которые отображаются условно, не должны быть целевыми в атрибутах рендеринга для элементов управления Ajax.Для успешного обновления на странице должен существовать элемент с тем же идентификатором, что и в ответе.Если необходимо добавить код на страницу, включите для него заполнитель (пустой элемент).

Так что добавьте обертку вокруг вашего outputPanel и укажите целевой объект в атрибуте reRender.

<a4j:outputPanel id="wrapper">
    <a4j:outputPanel id="someDisplayRegion" rendered="#{doc.ready && someClass.someBooleanMethod}"> 
        // bunch of stuff //
    </a4j:outputPanel>
</a4j:outputPanel>


<s:link reRender="wrapper" [...] />
1 голос
/ 15 июля 2011

s: ссылка не имеет атрибута reRender, она доступна только для компонентов RichFaces.

1 голос
/ 14 июля 2011

rich: menuItem и s: link не лучшие друзья.(особенно не в более ранней версии RichFaces).

Есть ли конкретная причина, по которой вы хотите использовать ссылку s: здесь?

Помещение действия и reRender в сам элемент menuItem должно работать нормально..

0 голосов
/ 15 июля 2011

Я не понимаю, почему вы думаете, что нажатие на этот пункт меню должно идти в someClass.someBooleanMethod, а не в runSomething.exportDoc (). В какой момент для doc.ready и someClass.someBooleanMethod установлено значение true? Вы можете поместить в ваш код отладочный оператор, который проверяет, что они установлены в true. Если они установлены в true, и ваш a4j: outputPanel по-прежнему не отображает , тогда , у вас проблема. Я использую ссылку s: как вы здесь, и она работает, но я помню, что мне пришлось возиться с ней. Убедитесь, что действие, запущенное по ссылке s: возвращает строку. «действия» должны возвращать строки, которые могут быть использованы для навигации, хотя в моем случае страница перемещается сама по себе (как ваша).

...