0
変更ページには2つのフォームがあります。最初のフォームでは、ajax-buttonは、ビューに収められたマネージドBeanの属性を初期化します。 2番目のフォームでは、ajax-buttonはその属性を使っていくつかの処理を行います。
問題は、2番目のフォームボタンによって呼び出されたメソッドが呼び出されないということです。その代わり、ビューイングされたBeanは再初期化され、同じボタンをもう一度押すと、属性はnullになり、NPEになります。
2つのボタンを同じフォームに配置すると、すべてが正常に機能します。
これは正常ですか?ajax対応のボタンは常に同じフォーム内に存在する必要がありますか?同じページ内の複数のフォームからのJSF ajaxコマンドボタンは、ビュースコープのbeanを再初期化します
<h:form id="frmDetail">
<h:commandButton id="btn_changePlant" title="#{msg.ttChangePlant}" immediate="true" image="/resources/img/edit.png">
<f:ajax event="click" render=":fsDetailPlant :headerMsg" listener="{assortiment.detailPlantId}"/>
</h:commandButton>
</h:form>
...some other code ...
<h:form id="frmOffers">
<h:commandButton id="btn_offers" title="#{msg.ttOfferPlant}" immediate="true" value="#{msg.btn_offers}">
<f:ajax event="click" render=":fsDetailPlant :headerMsg" listener="{assortiment.changeOffers}"/>
</h:commandButton>
</h:form>
と管理対象Beanが
@ManagedBean
@ViewScoped
public class Assortiment extends BeanObject implements Serializable {
....
public void detailPlantId(AjaxBehaviorEvent actionEvent) {
clear();
plantdetail = facade.findPlantdetail(plantdetailsIdModel.getRowData());
}
public void changeOffers(AjaxBehaviorEvent actionEvent) {
System.out.println("........ Assortiment.changeOffers(AjaxBehaviorEvent actionEvent)");
if (containerItems.isEmpty()) {
SessieUtils.fillPropertyItems(containerItems, PlantProperty.codeValuesList(ECodeType.logistic, "L02"), facade.getLocale());
}
//
if (offersModel == null) {
offersModel = new ListDataModel<OffersDto>(plantdetail.getOffersList());
}
}
@memetechでなければならないことであるかもしれません確かに、私のポストには#がありません。コメントに行を入れると、#記号を削除する必要があります。そうでなければ、式はまだ評価されます。とにかく、それは問題の原因ではありません。サーバサイドで何も変更せずに、両方のボタンが同じフォーム内に配置されると、すべてが完璧に機能します。 – rose