2015-01-30 5 views
0

Я довольно новичок в JSF/Facelets и стараюсь понять, где лучше всего поставить логику при принятии решения о том, нужно ли отображать контент в компоненте ui: repeat.Выполнение логики с состоянием с JSF ui: цикл повторения

В моем bean-компоненте у меня есть список сообщений, каждый из которых содержит дату. Я хочу распечатать все сообщения, но только отображать дату, когда она изменяется.

В настоящее время у меня есть что-то вроде ниже, где метод geting bean getter определяет, следует ли отображать дату сообщения на основе логики и состояния настройки в бэкэнде.

<ui:repeat value="#{bean.orderedMessages}" var="message" varStatus="messageLoop"> 

    <h:panelGroup rendered="#{bean.isDateRendered(messageLoop.index)}"> 
     #{message.formattedDate} 
    </h:panelGroup> 

    // some other stuff for each message 

</ui:repeat> 

Это плохо и ужасно, так как JSF вызывает метод геттера много раз, прежде чем на самом деле рендеринг, который добавляет дополнительную сложность методы газопоглотительной, код не имеет ничего общего с ничего, кроме должно ли быть оказано что-то или нет который действительно должен находиться в пользовательском интерфейсе, а метод getter имеет целую кучу неприятной логики, тогда как я бы предпочел вернуть простое свойство.

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

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

+0

сообщение в данном случае является объектом заполняется из базы данных. Он всегда будет отображаться, но имеет свойство (дату), которое может или не может быть передано исключительно по отношению к другим сообщениям в Списке во время выполнения. Я не думаю, что логика должна существовать в объекте сообщения, так как это пользовательский интерфейс, и сообщение также не знает других сообщений. Этот вопрос связан с проблемой управления состоянием объектов в рамках повтора и как управлять этим состоянием. –

+0

Возможно, JSF должен вызвать <:c:set... > на настройке бэкэнда последней даты визуализации. Не уверен, что это хорошая практика или нет, поскольку это не похоже на это. –

ответ

0

Из комментариев, поднятых BalusC в комментариях к вопросу, я внедрил следующее решение.

Мой Message объект из объекта/домен слоя возвращается к защитному бобу, когда экземпляр создается @PostConstuct, я создал еще одну модель в слое пользовательского интерфейса под названием UIAugmentedMessage который принимает Message в конструкторе, а также логическое свойство для isRendered и String для форматированной даты.

Содержит список объектов UIAugmentedMessage, когда список Message возвращается с сервера сразу после создания компонента и содержит правильное состояние полей isRendered и formattedDate.

Пользовательский интерфейс слой теперь упростить следующим образом

<ui:repeat value="#{bean.orderedMessages}" var="message"> 

    <h:panelGroup rendered="#{message.rendered}"> 
     #{message.formattedDate} 
    </h:panelGroup> 

</ui:repeat>