Как отключить элементы внутри ViewHandler после того, как jsf внедрил составной компонент?

Я использую ViewHandler для блокировки всех элементов ввода на любой доступной странице, если выполняются определенные критерии.

Это прекрасно работает для элементов ввода в «основных» файлах xhtml, но элементы ввода в составных компонентах не блокируются. Я решил, что это связано с тем, что JSF встраивает эти компоненты только после того, как мой ViewHandler завершит свою работу.

Кто-нибудь знает, как я могу отключить элементы в композите?


person Cos    schedule 22.02.2013    source источник
comment
Прежде всего меня удивляет, что вам удалось использовать обработчик представления для этого. Я ожидаю, что для этого будет использоваться прослушиватель фазы или компонентный прослушиватель. Другими словами, обработчик представления, скорее всего, просто не подходит для этой работы.   -  person BalusC    schedule 22.02.2013
comment
Сначала я попытался использовать фазовращатель, но это не сработало. Вообще. Можете ли вы подсказать мне в правильном направлении?   -  person Cos    schedule 22.02.2013
comment
Фазовый слушатель действительно неуклюж в GET-запросах. Вам придется вручную запускать сборку представления, если это еще не сделано во время предварительной фазы ответа на рендеринг (т.е. в представлениях без параметров представления). Я разместил ответ, используя прослушиватель компонентов.   -  person BalusC    schedule 22.02.2013


Ответы (1)


ViewHandler не подходит для этой работы . Он предназначен для создания, построения и восстановления представлений, а также для создания URL-адресов для использования в формах и ссылках JSF. Он не предназначен для управления компонентами в представлении.

Для ваших конкретных функциональных требований используйте SystemEventListener на PostAddToViewEvent, вероятно, лучше всего подходит. Я только что сделал быстрый тест, у меня он работает и на входах в композитах.

public class MyPostAddtoViewEventListener implements SystemEventListener {

    @Override
    public boolean isListenerForSource(Object source) {
        return (source instanceof UIInput);
    }

    @Override
    public void processEvent(SystemEvent event) throws AbortProcessingException {
        UIInput input = (UIInput) event.getSource();

        if (true) { // Do your check here.
            input.getAttributes().put("disabled", true);
        }
    }

}

Чтобы запустить его, зарегистрируйте его внутри <application> of faces-config.xml следующим образом:

<system-event-listener>
    <system-event-listener-class>com.example.MyPostAddtoViewEventListener</system-event-listener-class>
    <system-event-class>javax.faces.event.PostAddToViewEvent</system-event-class>
</system-event-listener>
person BalusC    schedule 22.02.2013