JSF 2 UIRepeat.Когда мой составной компонент вложен в повторе, я могу получить доступ к valueExpression, но не к его значению? - PullRequest
2 голосов
/ 25 ноября 2010

Я объявляю свой повторитель в форме (скажем, в main.xhtml):

<!--<itemRenderer:MetaFieldRenderer item="{kueditmeta.metaFieldFirst}" >
    </itemRenderer:MetaFieldRenderer>-->
    <ui:repeat var="foo" value="#{kueditmeta.metaFields}"  >
         <itemRenderer:MetaFieldRenderer item="#{foo}" >
         </itemRenderer:MetaFieldRenderer>  
    </ui:repeat>

Моя форма при отправке проверяет мой составной компонент MetaFieldRenderer.xhtml в повторителе, я смотрю на атрибут: <cc:attribute name="item" /> путем вызова MetaFieldRenderer (). GetModel ();

В моем компоненте Backs FaceComponent я раскрываю метод getModel ():

public MetaFieldModel getModel() {
        ELContext el = this.getFacesContext().getELContext();
        ValueExpression valExp = this.getValueExpression("item");
        Object itemValue = valExp.getValue(el);
        return (MetaFieldModel) itemValue;
    }

itemValue всегда равен нулю, когда я вкладываю MetaFieldRenderer в пользовательский интерфейс,Но если я раскомментирую то, что за пределами повторителя itemValue не равно нулю.

Кто-нибудь знает, что происходит?Есть ли лучший способ привязать и приписать мой FacesComponent?Мне не хватает необходимой реализации в моем компоненте, поэтому UIRepeat обновляет свои дочерние элементы?

(я использую JSF 2.0.3)

1 Ответ

0 голосов
/ 23 апреля 2011

Я ожидал, что компоненты будут заполняться практически на одной и той же фазе (или, по крайней мере, до фазы Invoke application (aka: action, navigateTo ...)).Но UIRepeat на этапе Invoke Application всегда содержал только одного дочернего элемента: itemRenderer, который он использовал бы для повторения, данные еще не повторялись (как я полагаю, на этапе визуализации?).

Я кое-что понял благодаря этим шагам:

  1. Фаза Restore View возвращает простой UIRepeat и его дочерние элементы объявляются в xhtml.Ни один UIRepeat еще ничего не заполняет, есть только itemRenderer без какого-либо значения в этой точке.
  2. Чтобы увидеть, как его дочерние элементы (если составной компонент) не связаны ни с чем в этот момент, используйте требуемыеАтрибут <cc:attribute required="true"... он выдаст ошибку, даже если вы дали атрибут, потому что uirepeat не пропустил их.

Извлеченный урок, не выполняйте логику / проверку правильности составного компонента, просто подумайтемодель.Теперь я управляю своим ретранслятором списком моделей, которые могут проверить себя, и если модель содержит предупреждающее сообщение или что-то еще, я просто отображаю его в составном компоненте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...