2011-09-08 3 views
1

우리는 Wicket에서 새로운 애플리케이션을 개발 중이며 작은 문제에 부딪 혔습니다.
Wicket에서 datatable 업데이트

우리가하는 일 :

1) 작성) 새로운 SortableDataProvider
2) 새로운 DefaultDataTablePagingInBottom
3) 새로운 WebMarkupContainer
4) WebMarkupContainer
5에 DefaultDataTablePagingInBottom 추가를 만들을 만들을 만들 새로운 AjaxCheckBox
6) AjaxCheckBox의 onUpdate에서 WebMarkupContainer를 AjaxRequestTarget에 추가하십시오.
7) SortableDataProvider를 새 것으로 설정하십시오 SortableDataProvider (업데이트 된 쿼리 사용)
8) DefaultDataTablePagingInBottom.replaceWith (새 DefaultDataTablePagingInBottom - 새 공급자 사용). happends 무엇

:

1) 체크 박스를 클릭 -> 아무것도 happends 없습니다.
2) 다시 클릭하십시오 -> 크래시 : "마지막 원인 :이 메서드는 부모에 이미 추가 된 구성 요소에서만 호출 할 수 있습니다 ..
WicketMessage : 인터페이스 org.apache.wicket.behavior.BehaviorListener의 onRequest 메서드 컴포넌트 [[Component id = checkBox]]의 [email protected]를 대상으로 한 경우 예외가 발생했습니다.
3) 브라우저에서 다시 클릭 -> 내가 필터링 한 목록 새로운 공급자.

아이디어가 있으십니까?

--- 편집 --- 여기에 몇 가지 코드가 있습니다.

model = new Model(projectPlannerService); 
provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isChecked); 
table = new DefaultDataTablePagingInBottom("table", columns, provider, 50); 

listContainer = new WebMarkupContainer("wmc"); 

listContainer.add(table); 
add(listContainer.setOutputMarkupId(true)); 

/* 
* checkbox för filtrering 
*/ 
AjaxCheckBox checkBox = new AjaxCheckBox("checkBox", new Model()) { 

    @Override 
    protected void onUpdate(AjaxRequestTarget target) { 
     target.add(listContainer, "wmc"); 
     isChecked = !isChecked; 
     provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isChecked); 
     updateTable(); 
    } 
}; 
add(checkBox); 

2) updateTable()에서 :

table.replaceWith(new DefaultDataTablePagingInBottom("table", columns, provider, 50)); 

3) SortableProjectDataProvider :

// Constructor 
public SortableProjectDataProvider(IModel<?> model, WebSession webSession, boolean isChecked) { 
    this.model = model; 
    this.projectPlannerService = (ProjectPlannerService) model.getObject(); 
    this.webSession = webSession; 
    setSort("customer", SortOrder.ASCENDING); 
    System.out.println("ischecked:" + isChecked); 
    if(!isChecked) 
     list = ((ProjectPlannerService) model.getObject()).findAllProjects(); 
    else 
     list = ((ProjectPlannerService) model.getObject()).findAllActiveProjects(); 

    System.out.println("size: " + list.size()); 

    comparator = new ProjectComparator(); 
} 

public Iterator<Project> iterator(int first, int count) { 

    Collections.sort(list, comparator); 
    if (first > list.size()) { 
     first = 0; 
    } 
    if (first + count > list.size()) { 
     return list.subList(first, list.size()).iterator(); 
    } else { 
     return list.subList(first, first + count).iterator(); 
    } 
} 

public IModel<Project> model(Project object) { 
    return new DetachableProjectModel((Project) object); 
} 

public int size() { 
    return list.size(); 
} 


private class DetachableProjectModel extends LoadableDetachableModel { 

    private Long id; 
    @SpringBean 
    ProjectPlannerService projectPlannerService; 

    public DetachableProjectModel(Long id) { 
     Injector.get().inject(this); 
     if (id == null) { 
      throw new IllegalArgumentException(); 
     } 
     this.id = id; 
    } 

    public DetachableProjectModel(Project project) { 

     this(project.getPk()); 
     Injector.get().inject(this); 
    } 


    public int hashCode() { 
     return id.hashCode(); 
    } 


    public boolean equals(final Object obj) { 
     if (obj == this) { 
      return true; 
     } else if (obj == null) { 
      return false; 
     } else if (obj instanceof DetachableProjectModel) { 
      DetachableProjectModel other = (DetachableProjectModel) obj; 
      return other.id == this.id; 
     } 
     return false; 
    } 


    protected Object load() { 
     return ((ProjectPlannerService) model.getObject()).findProjectById(id); 
    } 
} 

}

웹 페이지 생성자에서

1)

wicket : extend 012 3, -input 개찰구 : ID = "체크 박스"유형 = "체크 박스"- 쇼 활성 -/입력 -
-div 개찰구 : ID = "WMC"-
- 테이블 개찰구 : ID = "테이블"-/테이블 -
-/div-
-/개찰 : extend-
사전에

감사합니다!
/안드레아스

+0

일부 코드를 게시하십시오 –

+0

코드없이 답하기가 어렵습니다. –

답변

0

이 시도 :

잘못된 : target.add (listContainer, "WMC를");
오른쪽 : target.add (listContainer);

틀린; 표.replaceWith (새 DefaultDataTablePagingInBottom ("table", columns, provider, 50));
오른쪽 : DefaultDataTablePagingInBottom tmp = new DefaultDataTablePagingInBottom ("table", columns, provider, 50);
table.replaceWith (tmp);
table = tmp;
는 (당신은 당신의 참고 문헌 DefaultDataTablePagingInBottom하지만 대체합니다.)

// 올레

1

을 당신의 인생을 어렵게 만들고있는 새와 SortableProjectDataProvider의 인스턴스를 대체함으로써. 생성자에서 boolean isChecked을 사용하는 대신 IModel<Boolean>을 사용할 수 있습니다. 해당 모델의 동일한 인스턴스를 데이터 공급자 및 확인란에 지정하면 완료됩니다. onUpdate의 내용을 바꿀 필요가 없으며 AjaxRequestTargetlistContainer을 추가하면 모든 것이 올바르게 작동합니다.

예 :

... 

private IModel<Boolean> isCheckedModel = new Model<Boolean>(Boolean.FALSE); 

... 

provider = new SortableProjectDataProvider(model, (WebSession) getSession(), isCheckedModel); 

... 

AjaxCheckBox checkBox = new AjaxCheckBox("checkBox", isCheckedModel) { 

    @Override 
    protected void onUpdate(AjaxRequestTarget target) { 
     target.add(listContainer); 
    } 
}; 

... 

Wicket에서 새로운 것을 대체하는 것이 거의 불가능합니다. 모델의 변경 내용을 캡슐화하고 모델의 개체를 변경/대체합니다. 해당 모델에 대한 참조가있는 모든 개체는 업데이트 된 값을 보거나 필요에 따라 변경할 수 있습니다.

희망이 도움이됩니다.

관련 문제