Ich habe die folgende Befehlsschaltfläche in der Ansicht hinzufügen „Speicher“:Zugriff PrimeFaces Befehlsschaltfläche aus Bohnen Aktion Hörer mit ID
<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>
ich dynamisch bin versucht, um eine andere Action zuweisen. Wenn der Benutzer einen neuen Datensatz einfügen möchte, möchte ich, dass er die Einfügemethode aufruft. Wenn der Benutzer einen vorhandenen Datensatz aktualisieren möchte, sollte er die Aktualisierungsmethode aufrufen.
Im Moment bin ich versucht, dies zu tun:
@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));
}
Ich bin eine Null-Zeiger-Ausnahme auf der Linie erhalten:
button.addActionListener(new MethodExpressionActionListener(
methodExpression));
Was mache ich falsch? Gibt es einen anderen Weg, um das zu erreichen, was ich versuche? Ich benutze JSF 2.2, PrimeFaces 5.3 und OmniFaces 1.11.
'findComponent()' übernimmt die Client-ID als Argument, nicht die Komponenten-ID. Aber das sieht alles zu kompliziert aus. Das Definieren der Ansicht geschieht normalerweise in der XHTML-Datei, nicht in der Java-Klasse. Das Manipulieren des Komponentenbaums auf Java-Seite ist eine schlechte Übung. Sie können JSTL besser dafür verwenden, so dass Sie einfach XHTML verwenden können, das so viel selbst-dokumentierender ist als das Definieren von Komponenten/Attributen als Java-Code. – BalusC
Verstanden. Ich habe auch über zwei Befehlsschaltflächen nachgedacht: Update und ein weiteres Insert. Und Rendering eine gegeben Bedingung für die Aktualisierung und die andere mit einigen einfügen Bedingung. Was denkst du über dieses Design @BalusC? – Erick
Hängt davon ab, woher der Zustand kommt, aber das ist in der Tat ein Weg. Wenn die Bedingung auf der Zeit für die Erstellung von Views basiert, könnten Sie eine einzelne Befehlsschaltfläche mit einem '' verwenden, was im Grunde dasselbe ist wie Ihr Java-Code-Versuch. –
BalusC