2017-10-09 9 views
0

좋아, 조금 줄이고 게시물 끝에 코드를 넣으려고했습니다. 답변 해 주셔서 감사합니다.p : p : dialog에서 데이터 수정 후 datatable을 올바르게 새로 고치지 않았습니다.

주제에 대한 몇 가지 질문/답변을 읽고 해결 방법을 찾지 못한 경우 여기에 내 문제가 있습니다. 가능한 한 간결하게 작성되었으므로 일부 코드가 잘릴 수 있으므로 자세한 내용을 자유롭게 물어보십시오. 나는 또한 JSF, primefaces 세계에 상당히 익숙하다.

Spring/Hibernate/Primefaces를 기반으로 기존 웹 응용 프로그램에서 발전/수정 사항을 개발합니다. 사용자 인터페이스에는 일부 p : datatable : 회사, 사용자가 포함 된 탭뷰가 있습니다. 'formCompany'에서

  • 는, 버튼 대화 'createCompany'을 표시

    그래서 여기 내 사용 사례입니다.

  • 나는 (이름과 코드가 societeEntity을 위해 필수) 회사 'AAAA의 /의 AAAA'를 만들 - 회사가 추가됩니다> 'CompaniesTable'

  • 나는이 회사 존 '에 관련된 사용자를 생성/'AAAA'(이름과 회사 utilisateurEntity을위한 필수 필드입니다) - 사용자가 회사 이름으로 만든 'USERTABLE'에 표시됩니다>는 'AAAA'

  • 내가이 회사의 'BBBB'에 이름을 수정 저장하고 -> 'userTable'에서 회사 이름이 업데이트되지 않음

나는 userTable이 commandButton의 'update'속성으로 데이터베이스에서 새로 고쳐지지 않는다고 생각합니다. ": panelBas : formUser : userTable"의 'update'속성은 클라이언트 측에서만 제대로 작동합니다.

사용자가 포함 된 데이터 테이블은 새로운 회사 이름 'bbbb'로 새로 고쳐집니다.

트릭 내가 시도 : 페이지에

  • 업데이트 속성 : 그 widgetVar ID로 commanbButton.oncomplete와 '/ 다시로드/업데이트 새로 고침'는 hypothetic 전화 : 명령 단추 =>
  • 이 페이지에서 USERTABLE에 도달 실패

    012 : 실패> =을 ('USERTABLE') PF를 사용하는 방법은 다음

회사를 저장하는 버튼의 코드 (primefaces 문서는 정말 ... 도움이되지 않음)

구성 요소 p : datatable에는 서버에서 데이터를 다시로드하는 메소드가없는 것 같습니다. 그러면 백킹 빈에 회사를 저장 한 후 내 사용자 데이터 테이블을 어떻게 업데이트 할 수 있습니까?

아래 코드 ...

메인 tabview, 대화 상자 datatables 함유 XHTML 페이지를 도시한다.

@Component("companyDialog") 
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class CompanyDialog { 
    // Managed property used by datatable attribute 'value' 
    @ManagedProperty("#{companyList}") 
    private List<SocieteEntity> companyList; 

    // Managed property used by datatable attribute 'filteredValue' 
    @ManagedProperty("#{companyFilteredList}") 
    private List<SocieteEntity> companyFilteredList; 

    @ManagedProperty("#{societeEntity}") 
    private SocieteEntity societeEntity; 

    @Override 
    public void save() { 
     ... 
    } 
} 

이 UserDialog.java

@Component("userDialog") 
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class UserDialog { 
    // Managed property used by datatable attribute 'value' 
    @ManagedProperty("#{utilisateurList}") 
    private List<UtilisateurEntity> utilisateurList; 

    // Managed property used by datatable attribute 'filteredValue' 
    @ManagedProperty("#{utilisateurFilteredList}") 
    private List<UtilisateurEntity> utilisateurFilteredList; 

    @ManagedProperty("#{utilisateurEntity}") 
    private UtilisateurEntity utilisateurEntity; 

    public void recherche() { 
     // Fills the managed property utilisateurList (used by the datatable) 
     ... 
    } 
} 

사전에 감사하고 좋은 하루 되세요

CompanyDialog.java : XHTML

여기
<p:tabView id="panelBas" widgetVar="wvPanelBas" activeIndex="#{searchDialog.activeIndex}"> 
    <p:tab title="Companies"> 
     <h:form id="**formCompany**"> 
      <p:dataTable id="CompaniesTable" value="#{companyDialog.companyList}" var="item3" lazy="false" 
       tableStyle="text-align: center;width:auto" paginator="true" rowsPerPageTemplate="5,10,15,20,30,50,100" rows="15" 
       sortBy="#{item3.nom}" sortOrder="ascending" filteredValue="#{companyDialog.companyFilteredList}"> 
       ... 
      </p:dataTable> 
     </h:form> 
    </p:tab> 

    <p:tab title="Users"> 
     <h:form id="formUser"> 
      <p:dataTable id="userTable" widgetVar="wvUserTable" **value="#{userDialog.utilisateurList}"** var="item2" lazy="false" 
       tableStyle="text-align: center;width:auto" paginator="true" rowsPerPageTemplate="5,10,15" rows="10" 
       sortBy="#{item2.nom}" sortOrder="ascending" filteredValue="#{userDialog.utilisateurFilteredList}"> 

       **<!-- This value is not updated when associated company's name is modified--> 
       <p:column filterBy="#{item2.societe.nom}" sortBy="#{item2.societe.nom}" headerText="Company"> 
        <h:outputText value="#{item2.societe.nom}" /> 
       </p:column>** 
       ... 
       <p:column filterBy="#{item2.nom}" sortBy="#{item2.nom}" headerText="Nom" sortOrder="ascending"> 
        <h:outputText value="#{item2.nom}" /> 
       </p:column> 
      </p:dataTable> 
     </h:form> 
    </p:tab> 
</p:tabView> 

<!-- This dialog allows to modify company data --> 
<p:dialog header="New Company" widgetVar="createCompany" id="createCompany" resizable="true" modal="true" width="500" showEffect="clip" hideEffect="clip"> 
    <h:form> 
     ... 
     <!-- Company modification form --> 
     <p:commandButton value="Save" update="companyNameMsg companyCodeMsg :panelBas:formCompany:CompaniesTable **:panelBas:formUser:userTable**" ajax="true" 
      actionListener="#{companyDialog.save}" icon="ui-icon-disk" 
      **oncomplete="if(args &amp;&amp; !args.validationFailed) { PF('createCompany').hide(); }"** /> 
    </h:form> 
</p:dialog> 

는 콩의 코드입니다.

+1

도 [좋은 질문입니다] (https://stackoverflow.com/help/how-to-ask) –

답변

0

귀하의 질문 : "회사를 저장 한 후 내 사용자 datatable을 어떻게 업데이트합니까?" JSF에서 대화 상자의 버튼에서

이 시도 : 먼저 업데이트 대상에서

<h:commandButton id="ok" value="OK"> 
    <p:ajax click="messagesDialog.hide()" 
    update="@all"/> 
</h:commandButton> 

, 사용 @form을 시도 나던 작업 시도를 사용 imediate 경우 나던 작품은, @all

를 사용하는 경우 = "true", imatiate true, 이것이 주문 수명주기를 변경합니다. 아마도 sugestions가 작동하지 않을 경우 문제를 해결하십시오. 나는 당신이 질문을 간단하다고 생각하고, 많은 텍스트를 써야하지 않습니다.

+1

'@ all'은 아주 드물게 사용되어야합니다. 'immediate = "true"'는 현대의 jsf/ajax 기반 응용 프로그램에서는'process \ execute' 속성이 있기 때문에 거의 필요하지 않습니다. – Kukeltje

+0

예. 내 말은, 범위를 늘리십시오. 먼저 초기 범위를 사용해야합니다. 만약 작동하지 않으면. 궁극적 인 경우 "@all"또는 "@form"을 사용하십시오. 대답 해줘서 고마워요 –

0

그래서 저는 주입 된 콩으로 용액을 파고 작동 시켰습니다.

아이디어는 다음 링크에 있습니다. Can I call multiple methods from <p:ajax event=select listner=method1, metho2>?.

어떤 개선이 이루어질 수있는 경우
@Component("companyDialog") 
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class CompanyDialog { 
    @Inject 
    private UserDialog userDialog; 

    // When I update a company, the list userDialog.utilisateurList of users is reloaded in userDialog 
    public void save() { 
     // ... 
     userDialog.recherche(); 
    } 
} 

@Component("userDialog") 
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class UserDialog { 
    @ManagedProperty("#{utilisateurList}") 
    private List<UtilisateurEntity> utilisateurList; 

    // Fills the list utilisateurList 
    public void recherche() { 
     // ... 
    } 
} 

주시기 :이 방법은 주석에 대한 매우 깨끗 경우 잘 모르겠습니다

...

나는이 같은 CompanyDialog 콩에 UserDialog 빈을 주입 조언을 해줄 수 있습니다.