我遇到了以下问题:
我可以毫无问题地添加角色,但由于 roleController.selectedRole 为 null ,我需要删除或编辑它不起作用。 起初我将托管bean作为requestScope,我虽然null可能来自那里,因为每次请求都会重新创建bean。 所以我改为ViewScoped修复了添加按钮再次工作,但我仍然遇到编辑和删除相同的问题。
发生的事情如下:我选择一行并单击按钮编辑。这将正确显示包含角色信息的对话框。但是当我点击编辑时,我得到空值。 我看过几个例子,似乎我没有做错任何事。但我可能会遗漏一些非常基本的东西:/
非常感谢任何见解!
至于豆我有以下几点:
@ManagedBean
@RequestScoped
....
private Roles selectedRole = new Roles();
(I have the normal setter and getter)
public void edit() {
Logger.getGlobal().log(Level.INFO, "====> EDIT ROLE" + selectedRole.getRole());
}
页面如下:省略ui:define和header things。
<h:form id="contentView">
<p:dataTable id="lstRoles" var="r" value="#{roleController.rolesList}" selectionMode="single"
selection="#{roleController.selectedRole}" rowKey="#{r.role}" paginator="true"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {CurrentPageReport} {RowsPerPageDropdown}"
rowsPerPageTemplate="10,15,50" rows="10">
<p:column headerText="Role" sortBy="#{r.role}">
<p:outputLabel value="#{r.role}"></p:outputLabel>
</p:column>
<p:column headerText="Description">
<h:outputLabel value="#{r.description}"></h:outputLabel>
</p:column>
<f:facet name="footer">
<p:commandButton value="New" icon="ui-icon-star" oncomplete="newRoleDialog.show()"></p:commandButton>
<p:commandButton value="Edit" icon="ui-icon-check" oncomplete="editRoleDialog.show()" update=":editRoleForm:editRolePanel"></p:commandButton>
<p:commandButton value="Delete" icon="ui-icon-trash"></p:commandButton>
</f:facet>
</p:dataTable>
<p:blockUI block="lstRoles" trigger="lstRoles">
LOADING
</p:blockUI>
</h:form>
<!-- Edit User -->
<p:dialog header="Edit User" widgetVar="editRoleDialog" resizable="false">
<h:form id="editRoleForm">
<p:panelGrid id="editRolePanel" columns="2">
<h:outputText value="Role: "></h:outputText>
<h:outputText value="#{roleController.selectedRole.role}"></h:outputText>
<h:outputText value="Description: "></h:outputText>
<p:inputText value="#{roleController.selectedRole.description}" required="true"></p:inputText>
<f:facet name="footer">
<p:commandButton value="Confirm" update=":contentView:lstRoles :growl" oncomplete="handleSubmitRequest(xhr, status, args, 'editRoleDialog','editRoleForm');" actionListener="#{roleController.edit()}"></p:commandButton>
<p:commandButton type="reset" value="reset"></p:commandButton>
</f:facet>
</p:panelGrid>
</h:form>
</p:dialog>
编辑:我正在使用带有primefaces 3.5的Glassfish 3.1
编辑2:所以,似乎我不能使用输出标签。如果我改为输入,那么我在managedbean中得到了所需的值(我猜它是因为它调用了setter,尽管我认为它在选择行时已经处理过了)。但我不想编辑第一个字段,因为这是PK键,它在表中也用作FK。但至少知道我知道发生了什么,或者或多或少。
答案 0 :(得分:1)
您需要将从datatable中选择的角色设置为managedbean的selectedrole属性,试试这个:
<p:commandButton value="Edit" icon="ui-icon-check" oncomplete="editRoleDialog.show()" update=":editRoleForm:editRolePanel">
<f:setPropertyActionListener target="#{roleController.selectedRole}" value="#{r}"/>
</p:commandButton>
你也很可能也需要将bean ViewScoped。
编辑:我不知道数据表的选择功能,澄清你是否正在使用它,你不需要上面的代码。
答案 1 :(得分:-1)
在inputtext中尝试 valueChangeListener 属性。你很难在 @SessionScope 中拥有实体的一部分。如果您使用
,它确实有效<inputText value="#{bean.value}"/>
但如果您使用
可能无效<inputText value="#{bean.entity.value}"/>
。使用 valueChangeListener 并创建一个这样的方法可以强制为您的实体保存价值。
public void saveValue(ValueChangeEvent event) {
Integer newValue = (Integer) event.getNewValue();//u can use getOldValue to get value before
entity.setValue(newValue);
}
古德勒克!