私はJSF2を学び、単純なカスタムコンポーネントで遊んでいます。2つのinputTextフィールドを持つajax対応のカスタムコンポーネントを想像してみてください。
...
<h:body>
<composite:interface>
<composite:attribute name="domId" required="true" />
<composite:attribute name="value" required="true" />
</composite:interface>
<composite:implementation>
<h:inputText id="code" value="#{cc.attrs.value}">
<f:valueChangeListener binding="#{domBean}" >
</f:valueChangeListener>
<f:ajax event="valueChange" execute="@this"
render="name"/>
</h:inputText>
<h:inputText id="name" value="#{domBean.name}" disabled="true">
</h:inputText>
</composite:implementation>
...
コンポーネントを使用しているページは次のようになります。
...
<h:body>
<h:form>
<dom:domain domId="100" value="#{testCtrl.code}"/>
</h:form>
</h:body>
...
domBeanを定義するクラスの興味深いメソッドは次のようになります。
public void processValueChange(ValueChangeEvent event)
throws AbortProcessingException
{
String code = (String) event.getNewValue();
UIInput input= (UIInput) event.getSource();
name = resolveCode(code); //some magic transformation
if (name != null)
input.setValue(code); //just want to set the "entered" / "validated" text
}
input.setValue(code)がinputText値を設定することを期待します。これは、「親」ページによって#{testCtrl.code}にリンクされている遅延式「#{cc.attrs.value}」です。残念ながら、testCtrl.codeに入力された値が入力されることはありません。
私が間違っていることは何ですか?
ありがとうございました!