Как составной компонент устанавливает свойство в компоненте поддержки своего клиента? - PullRequest
6 голосов
/ 23 августа 2011

У меня есть составной компонент с интерфейсом, который содержит это:

<cc:attribute name="model"
                  shortDescription="Bean that contains Location" >
        <cc:attribute name="location" type="pkg.Location"
                      required="true" />
    </cc:attribute>
</cc:interface>

Так что я могу получить доступ к объекту Местоположение в разметке с помощью # {cc.attrs.model.location} .

Я также обращаюсь к этому объекту из базового компонента составного компонента следующим образом:

    FacesContext fc = FacesContext.getCurrentInstance();
    Object obj = fc.getApplication().evaluateExpressionGet(fc, 
            "#{cc.attrs.model.location}", Location.class);

Итак, теперь мой составной компонент выполнил свою работу -Как я могу вызвать метод установки на модель из базового компонента?(т.е. model.setLocation (someValue) ?

Ответы [ 2 ]

7 голосов
/ 23 августа 2011

Используйте ValueExpression#setValue().

FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExpression = facesContext.getApplication().getExpressionFactory()
    .createValueExpression(elContext, "#{cc.attrs.model.location}", Location.class);

valueExpression.setValue(elContext, newLocation);

Application#evaluateExpressionGet(), кстати, звонит ValueExpression#getValue() под одеялом,точно так же, как описано в javadoc (если вы когда-либо читали это ...)


Не имеет отношения к конкретной проблеме, знаете ли вы о возможностисоздать класс поддержки UIComponent для составного компонента?Могу поспорить, что это намного проще, чем возиться с ValueExpression s таким образом.Затем вы можете просто использовать унаследованный метод getAttributes(), чтобы получить model.

Model model = (Model) getAttributes().get("model);
// ...

Вы можете найти пример на нашей вики-странице составного компонента .

1 голос
/ 01 августа 2013

как насчет атрибута "по умолчанию"?Похоже, это не реализовано при использовании реализации компонента поддержки.

xhtml:

<composite:interface>
    <composite:attribute name="test" 
                         type="java.lang.Boolean" 
                         default="#{false}"/>
</composite:interface>
<composite:implementation >
    TEST : #{cc.attrs.test}
</composite:implementation >

Поддержка поддержки Java:

 testValue = (Boolean) getAttributes().get("test");

, если установлен атрибут тестав основном xhtml нет проблем: оба xhtml и java backing имеют одинаковое значение.Но когда не установлено, значение по умолчанию только для xhtml: html содержит

TEST : false 

Но testValue равно нулю при поддержке

...