我與ID的視圖下執行命令按鈕「保存」:訪問PrimeFaces命令按鈕從豆添加的動作監聽
<p:panel style="border:none;text-align:left;margin:0;">
<p:commandButton value="Save Document" id="save" icon="fa fa-save"
disabled="#{dIGRCController.digrc.qconce == '020'}">
<f:param name="validate" value="true" />
</p:commandButton>
<p:commandButton value="Clear" icon="fa fa-undo"></p:commandButton>
</p:panel>
我試圖動態地分配不同的ActionListener。如果用戶想插入一些新記錄,我希望它調用插入方法。如果用戶想要更新現有記錄,則應調用更新方法。
現在我想這樣做:
@PostConstruct
public void init() {
// setting the action listener of the Save Document button
UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();
// UIComponent button = viewRoot.findComponent("save");
CommandButton button = (CommandButton) viewRoot.findComponent("save");
FacesContext context = FacesContext.getCurrentInstance();
MethodExpression methodExpression = context
.getApplication()
.getExpressionFactory()
.createMethodExpression(context.getELContext(),
"#{dIGRCController.updateDocument}", null,
new Class[] { DIGRCController.class });
button.addActionListener(new MethodExpressionActionListener(
methodExpression));
}
我得到一個空指針異常就行了:
button.addActionListener(new MethodExpressionActionListener(
methodExpression));
我在做什麼錯?是否有另一種方法來完成我想要做的事情?我正在使用JSF 2.2,PrimeFaces 5.3和OmniFaces 1.11。
'findComponent()'將客戶端ID作爲參數,而不是組件ID。但是這一切看起來過於複雜。定義視圖通常發生在XHTML文件而不是Java類中。在Java端操作組件樹是一個不好的做法。您可以更好地使用JSTL,這樣您就可以繼續使用XHTML,它比定義Java代碼的組件/屬性更加自我記錄。 – BalusC
明白了。我也在考慮有兩個命令按鈕:更新和另一個插入。渲染一個給出了一些更新條件,另一個給出了一些插入條件。你怎麼看待@BalusC的設計? – Erick
取決於病情來自哪裏,但這確實是一種方式。如果條件是基於視圖生成時間的,則可以使用帶有''的單個命令按鈕,基本上與您的Java代碼嘗試相同。 –
BalusC