2016-11-21 6 views
2

특정 경우에만 편집 할 수 있어야하는 단일 열이있는 listView가 있습니다. 사용자가 열을 변경해야하는 경우 행의 수정 버튼을 클릭 한 다음 셀의 레이블을 textField로 바꾸기를 원합니다. Replace를 호출하면 TextField가 결코 렌더링되지는 않지만 레이블의 위치에 있음을 알 수 있습니다. 이벤트를 처리 할 AjaxLink가 있습니다. 컨테이너를 사용하여 listView를 다시 그리는 중입니다. 당신이 볼 수 있듯이동적으로 ListView 테이블 셀을 textField wicket으로 교체하십시오.

parent = new WebMarkupContainer("emp-table-parent"); 

    parent.add(new AjaxLink<Object>(FIRST_NAME_HEADER_LINK) { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = -1937727929649333407L; 

     @Override 
     public void onClick(AjaxRequestTarget target) { 

      changeGlyphUpdateList(target, parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON), 
        parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
        parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
        parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON)); 

     } 

    }.add(new Label("first-name-header-label", Model.of("First Name")), new WebComponent(FIRST_NAME_HEADER_ICON)), 
      new AjaxLink<Object>(LAST_NAME_HEADER_LINK) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = -3438649095509412910L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 

        changeGlyphUpdateList(target, parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
          parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON), 
          parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), 
          parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
          parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON)); 

       } 
    }.add(new Label("last-name-header-label", Model.of("Last Name")), new WebComponent(LAST_NAME_HEADER_ICON)), 
      new AjaxLink<Object>(EMAIL_HEADER_LINK) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = 2890934302751793454L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 

        changeGlyphUpdateList(target, parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), 
          parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
          parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON), 
          parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
          parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON)); 

       } 

    }.add(new Label("email-header-label", Model.of("Email")), new WebComponent(EMAIL_HEADER_ICON)), 
      new AjaxLink<Object>(ELIGIBILITY_CLASS_HEADER_LINK) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = -4022209586109961448L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 

        changeGlyphUpdateList(target, parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
          parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), 
          parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
          parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON), 
          parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON)); 

       } 

    }.add(new Label("eligibility-class-header-label", Model.of("Elig. Class")), new WebComponent(ELIGIBILITY_CLASS_HEADER_ICON)), 
      new AjaxLink<Object>(EMPLOYER_HEADER_LINK) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = -738777257301408437L; 

       @Override 
       public void onClick(AjaxRequestTarget target) { 

        changeGlyphUpdateList(target, parent.get(EMPLOYER_HEADER_LINK).get(EMPLOYER_HEADER_ICON), 
          parent.get(ELIGIBILITY_CLASS_HEADER_LINK).get(ELIGIBILITY_CLASS_HEADER_ICON), 
          parent.get(EMAIL_HEADER_LINK).get(EMAIL_HEADER_ICON), 
          parent.get(LAST_NAME_HEADER_LINK).get(LAST_NAME_HEADER_ICON), 
          parent.get(FIRST_NAME_HEADER_LINK).get(FIRST_NAME_HEADER_ICON)); 

       } 

    }.add(new Label("employer-header-label", Model.of("Employer")), new WebComponent(EMPLOYER_HEADER_ICON)), 
    new PageableListView<EmployeeSummaryPkt>("data", employeeSummaryModel.getObject(), 25) { 

       /** 
       * 
       */ 
       private static final long serialVersionUID = -1697070076764699904L; 

       @Override 
       protected void populateItem(final ListItem<EmployeeSummaryPkt> item) { 

        item.setDefaultModel(new CompoundPropertyModel<EmployeeSummaryPkt>(item.getModelObject())); 

        item.add(new Label("firstName"), 
          new Label("lastName"), 
          new Label("employeeEmail"), 
          new Link<Object>("eligibility-class-data-link") { 

           /** 
           * 
           */ 
           private static final long serialVersionUID = -3842291392813313171L; 

           @Override 
           public void onClick() { 

            //LINK TO ELIGIBILITY CLASS OR MAYBE THE SECTION WITHIN THE EMP? 

           } 
        }.add(new Label("employeeEligibilityClassSummaryPkt.name")), 
          new Link<Object>("employer-data-link") { 

           /** 
           * 
           */ 
           private static final long serialVersionUID = 6809571267919974106L; 

           @Override 
           public void onClick() { 

            getIndex().getHomePanel().setNewContent(new EmployerDetailPanel("panel-content", item.getModelObject().getEmployerSummaryPkt().getId())); 

           } 

        }.add(new Label("employerSummaryPkt.name")), 
          new Label("employeeDateOfBirth"), 
          new Label("employee-code", Model.of(item.getModelObject().getEmployeeName())).setOutputMarkupId(true), 
          new AjaxLink<Object>("edit-employee-link") { 

           /** 
           * 
           */ 
           private static final long serialVersionUID = 6061544430700059358L; 

           @Override 
           public void onClick(AjaxRequestTarget target) { 

            logr.log(Level.FINER, "onClick for edit employee"); 

            logr.log(Level.FINER, "employee code pre: " + item.get("employee-code").getClass().getSimpleName()); 
            item.get("employee-code").replaceWith(new TextField<String>("employee-code", new Model<String>(item.getModelObject().getEmployeeName())).setOutputMarkupId(true)); 
            logr.log(Level.FINER, "employee code post: " + item.get("employee-code").getClass().getSimpleName()); 
            target.addChildren(parent, TextField.class); 
            target.add(parent); 
           } 
        }); 
       } 

는, 아이디 "직원 코드"와 레이블이 내가 대체하려는 레이블 : 여기 내 목록보기입니다. AjaxLink onClick에서 레이블을 가져오고 교체 할 위치를 볼 수 있습니다. 아무것도 바뀌지 않습니다. 어떤 방향이나 도움이 대단히 감사하겠습니다.

+0

게시자가 게시 한 코드 스 니펫에 'parent'선언이없는 것 같습니다. – WiseTree

+0

죄송합니다. 위에서 편집하여 부모 용 스 니펫에 추가했습니다. – SteveManC

답변

3

ListView는 각 항목의 항목이 렌더링되면 변경된 listItem이 즉시 버려지는 경우 각각을 다시 만듭니다.

ListView#setReuseItems(true) 도움이 될 것입니다.

+0

정확히 내가 무엇을 찾고 있었습니까. 감사. 희망이 비슷한 문제와 다른 사람을 도와줍니다. – SteveManC

2

svenmeier의 대답에 대한 대안은 AjaxRequestTarget으로 변경된 특정 항목 만 추가하는 것일 수도 있습니다. 즉, 전체 테이블에 반대, 다시 렌더링 할 변화에 관한 마크 업의 조각을 야기

target.add(item.get("employee-code")) 

으로

target.addChildren(parent, TextField.class); 
target.add(parent); 

를 교체합니다. 테이블이 크고 많은 요소를 포함하고있는 모델의 경우 복잡한 검색 메커니즘이 필요한 테이블을 사용하면 전체 테이블을 렌더링하는 것이 훨씬 힘들어 지므로 항목 만 다시 렌더링하면 더 나은 솔루션이됩니다.

당신의 특별한 경우에는 svenmeier의 솔루션이 더 좋습니다. 그렇지 않으면 솔루션을 구현하고 나중에 전체 테이블을 다시 렌더링하면 변경 사항이 손실됩니다.

+1

나는 이것이 과거에 사용했던 방법이라는 것에 동의한다. 그러나 나는이 테이블에 내장 된 칼럼 기능에 따라 정렬했기 때문에 나를 탈출시켰다. 따라서 왜 전체 테이블을 가진 부모를 추가했는지 알 수있다. 답변 해주셔서 감사합니다. 나는 @ svnemeier의 답변이 더 적절할 것이라고 생각한다. 왜냐하면 만약 그들이 정렬한다면, 텍스트 필드는 디폴트 레이블로 대체 될 것이기 때문이다. 그럼에도 불구하고 아주 좋은 대답. – SteveManC