처음에는 데이터가없는 데이터 테이블 (빈 목록)이 있습니다. 테이블 바닥 글에 행을 테이블에 추가하는 commandButton
이 있습니다. 행이 추가되면 행의 마지막 셀은 행을 삭제할 또 다른 commandButton
입니다. 내 문제는 삭제 단추가 선택한 행에 관계없이 테이블의 첫 번째 행을 계속 삭제한다는 것입니다.commandButton action = "# {bean.delete (row)}"가 잘못된 행을 전달하는 것 같습니다.
예 : 테이블에 3 개의 행을 추가하고 두 번째 행의 마지막 셀에있는 삭제 버튼을 누르면 action="#{addAccountBean.deleteFixVendor(dataItem)}"
은 클릭 된 두 번째 행 대신 첫 번째 행을 deleteFixVendor
메쏘드로 전달합니다. 나는 첫 번째 행에 대한 객체가 어떤 행 버튼이 클릭되었는지에 관계없이 delete 메소드에 전달되는 것을 계속 유지하는 이유를 알 수 없습니다.
내 JSF 코드 :
<h:form>
<f:validateBean disabled="#{!empty param['disableValidation']}" >
<p:panel id="panel" header="Add New Account" >
<p:dataTable var="dataItem" value="#{addAccountBean.account.vendors}" >
<p:column headerText="Vendor" >
<p:selectOneMenu value="#{dataItem.vendor}">
<f:selectItems value="#{addAccountBean.menu.fixOption}" />
</p:selectOneMenu>
</p:column>
<p:column headerText="Monthly Cost" >
<p:inputText value="#{dataItem.cost}" />
</p:column>
<p:column headerText="Cost Date" >
<p:calendar value="#{dataItem.CDate}" pattern="MM/dd/yyyy" navigator="true" />
</p:column>
<p:column headerText="Delete" >
<h:commandButton value="Delete" action="#{addAccountBean.deleteFixVendor(dataItem)}" >
<f:param name="disableValidation" value="true" />
</h:commandButton>
</p:column>
<f:facet name="footer" >
<h:commandButton value="Add New Vendor" action="#{addAccountBean.addFixVendor}" >
<f:param name="disableValidation" value="true" />
</h:commandButton>
</f:facet>
</p:dataTable>
</p:panel>
</f:validateBean>
</h:form>
콩 코드 : 어떤 제안을 부탁드립니다
@ManagedBean
@SessionScoped
public class AddAccountBean implements Serializable {
private AccountData account = new AccountData();
public String addFixVendor() {
account.getVendors().add(new VendorData());
return "";
}
public String deleteFixVendor(VendorData vData) {
account.getVendors().remove(vData);
return "";
}
.
당신은 그것을 결론나요 관찰 또는 디버깅을 기반으로? 'deleteFixVendor()'메소드에 중단 점을 넣고 전달 된'vData' 인스턴스를 검사 했습니까? 아니면 단순히 최종 결과를 관찰하고 전달 된 'vData' 인스턴스가 첫 번째 행이라고 가정 했습니까? 즉,이 문제는 JSF/EL 자체가 아닌'VendorData' 클래스의'equals()'메소드가 깨져서 발생합니다. – BalusC
감사합니다. @BalusC. 그것은'VendorData' 클래스에서 깨진'equals()'메소드의 결과였습니다. 이제 작동 중입니다. – Stevenyc091
좋습니다. 나는 대답을 올렸다. – BalusC