Как сохранить состояние DOM, которым манипулирует jQuery / javasscript при повторной визуализации компонентов richfaces / jsf? - PullRequest
1 голос
/ 19 января 2012

У меня проблема с рендерингом некоторых моих компонентов в моем приложении jsf.Проблема в том, когда я использую jQuery на своей странице, например, скрывая кнопку.Когда страница перерисовывается, кнопка возвращается к своей первоначальной форме, которая должна быть скрыта.

Имеет кто-то опыт в этом вопросе, который сможет помочь мне найти подходящее решение, или здесь есть некоторые принципы илиметоды, которые я слепо неправильно понял?

Спасибо.:)

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Проблема в том, что я использую jQuery на своей странице, например, скрывая кнопку. Когда страница перерисовывается, кнопка возвращается к своей первоначальной форме, которая должна быть скрыта.

Не используйте jQuery для управления DOM, но вместо этого используйте JSF Ajax для управления DOM.

1009 * Е.Г. *

<h:form>
    <h:selectBooleanCheckbox value="#{bean.checked}">
        <f:ajax render="buttons" />
    </h:selectBooleanCheckbox>

    <h:panelGroup id="buttons">
        <h:commandButton value="Submit" rendered="#{bean.checked}" />
    </h:panelGroup>
</h:form>

Смотри также:

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

Мы столкнулись с той же проблемой в IceFaces 1.8.2. Проблема в том, что приложение на стороне сервера не знает об изменениях на стороне клиента в DOM. Мы решили это за нас, применив классы маркеров к элементам, которыми мы хотели манипулировать с помощью jQuery. Мы использовали общий обратный вызов на стороне клиента для DOM-Updates (onAsynchronousReceive под IceFaces 1.8.x), чтобы повторно применить наш скрипт.

К сожалению, не относится к RichFaces:

<h:outputText value="my text" styleClass="doSomethingWithThisAfterDOMUpdate" />

И где-то в разметке вашей страницы (мы используем jQuery, привязанный к j вместо $):

<script type="text/javascript">

    // do somehting the first time
    j(".doSomethingWithThisAfterDOMUpdate").css('display', 'none'); 

    Ice.onAsynchronousReceive("document:body", function() {

        // do it again after each asynchronous receive
        j(".doSomethingWithThisAfterDOMUpdate").css('display', 'none');
    });
</script>

НО : будьте осторожны, применяя слушателей к элементам в обратном вызове. Если элемент не заменяется, вы назначаете тем же слушателям второй, третий, четвертый раз ...

Под JSF2 AJAX стал частью спецификации. Вы могли бы взглянуть на метод на стороне клиента addOnEvent , который может быть общей частью счетчика Ice.onAsynchronousReceive.

Тем не менее, не все компоненты инфраструктуры, по-видимому, используют реализацию спецификации на стороне клиента для выполнения своих обновлений DOM (т.е. PrimeFaces).

Но я думаю, что принцип становится ясным. Вам нужно перезапустить сценарий после замены элемента DOM:)

...