2016-06-09 1 views
2

자식 창을 닫는 동안 부모 창을 새로 고치려면 ZK로 구현하고 싶습니다.ZK : 자식 창을 닫을 때 부모 창 새로 고침

parent.zul -이 드롭 다운에 값을 추가하기위한 드롭 다운과 버튼 (드롭 다운에 추가로 레이블 지정)이 있습니다. 이 버튼을 클릭하면 드롭 다운에 텍스트를 입력 할 수있는 자식 winow가 열립니다.

child.zul :이 입력란에는 드롭 다운 값과 'CLOSE'버튼을 입력 할 수 있습니다. 닫기 버튼을 클릭하면 하위 창을 닫고 상위 창에서 드롭 다운을 새로 고쳐야합니다.

미리 감사드립니다.

============================================== ============================

부모 : sock.zul

<window id="sockWindow" title="New Sock" width="600px" apply="SockController" mode="modal" closable="true"> 
    <div align="left" style="float: left;" >  
     <button id="btnLookup" label="Manage Lookup" width="150px"/> 
    </div>  
</window> 

sockController.java : 공개 클래스 SockController가 SelectorComposer를 확장 {

@Listen("onClick = button#btnLookup") 
public void onClickAdd() throws Exception { 
    showPopup(new EventListener<Event>() { 
     @Override 
     public void onEvent(final Event event) throws Exception { 
      Object someData = event.getData(); // cast to whatever object you expect to give. 
      //Make your refresh code here.     
     } 
    });   

} 

public static void showPopup(final EventListener<Event> eventListener) 
    throws InterruptedException { 
//you can give more params with the method to add them as arguments. 
    Map arguments = new HashMap<String, String>(); 
    arguments.put("source", "parent.zul"); 
    // arguments.put("hid", hwid.toString()); 
    // arguments.put("displaymode", displaymode); 

    openModal("/managelookup.zul",null, arguments, eventListener); 
} 

public static void openModal(final String page, final Component parent, 
    final Map<String, Object> obMap, 
    final EventListener<Event> onCloseListener) 
    throws InterruptedException { 
    for (final Map.Entry<String, Object> entry : obMap.entrySet()) { 
     Executions.getCurrent().setAttribute(entry.getKey(), 
      entry.getValue()); 
    } 
    Executions.getCurrent().setAttribute(Composition.PARENT, null); 
    final Component createComponents = Executions.createComponents(page, 
      parent, obMap); 
    Component parent1 = createComponents; 
    parent1 = getWindow(parent1); 
    if (parent1 instanceof Window) { 
     final Window window = (Window) parent1; 
     if (onCloseListener != null) { 
      //attach the listener so when popup is closed the listener is called. 
      window.addEventListener(Events.ON_CLOSE, onCloseListener); 
      window.addEventListener(Events.ON_CANCEL, onCloseListener); 
     } 
     window.doModal(); 
    } 
} 

}

아이 : m anagelookup.zul :

 <button id="cancel" label="Close"/> 
</window> 

ManageLookupsController.java : 공공 ManageLookupsController()이 예외를 throw {

@Listen("onClick = button#cancel") 
public void onClickCancel() { 

    manageLookup.setVisible(false); 
    manageLookup.detach(); 
    Events.postEvent(Events.ON_CLOSE, windowOrSpaceOwner, someData); 
}  

은}

답변

1

나는 우리의 응용 프로그램의 몇 가지 샘플 당신을 보여 드리죠 : 부모 작곡가에서

, 우리는 팝업을 열고 콜백에 대한의 EventListener를 제공 :

public void onActionShowPopup() { 
    showPopup(new EventListener<Event>() { 
      @Override 
      public void onEvent(final Event event) throws Exception { 
       Object someData = event.getData(); // cast to whatever object you expect to give. 
       //Make your refresh code here.     
      } 
     }); 
} 

public static void showPopup(final EventListener<Event> eventListener) 
     throws InterruptedException { 
    //you can give more params with the method to add them as arguments. 
    final Map<String, Object> args = new HashMap<>(); 
    args.put("modus", "modal"); 
    openModal("/WEB-INF/webpages/zk/popup/some_popup.zul",null, args, eventListener); 
} 

public static void openModal(final String page, final Component parent, 
     final Map<String, Object> obMap, 
     final EventListener<Event> onCloseListener) 
     throws InterruptedException { 
    for (final Map.Entry<String, Object> entry : obMap.entrySet()) { 
     Executions.getCurrent().setAttribute(entry.getKey(), 
       entry.getValue()); 
    } 
    Executions.getCurrent().setAttribute(Composition.PARENT, null); 
    final Component createComponents = Executions.createComponents(page, 
      parent, obMap); 
    Component parent1 = createComponents; 
    parent1 = getWindow(parent1); 
    if (parent1 instanceof Window) { 
     final Window window = (Window) parent1; 
     if (onCloseListener != null) { 
      //attach the listener so when popup is closed the listener is called. 
      window.addEventListener(Events.ON_CLOSE, onCloseListener); 
      window.addEventListener(Events.ON_CANCEL, onCloseListener); 
     } 
     window.doModal(); 
    } 
} 

public Component getWindow (Component comp) { 
    if (comp != null && !comp instanceof Window) { 
     return getWindow(comp.getParent()); 
    } 
    return comp; 
} 

그리고 당신의 팝업에서 물론

당신은 닫을 때 :

Events.postEvent(Events.ON_CLOSE, windowOrSpaceOwner, someData); 

이 코드로 어디서 작동하는지 a fiddle을 만들었습니다.
실수로 어디에서 볼 수 있습니까?

희망이 있으면 도움이 될 수 있습니다.

+0

코드를 제공해 주셔서 감사합니다. 코드를 사용하여 코드를 조정했습니다. 게시물에 붙여 넣었습니다. 아직 작동하지 않습니다. 네가 끝까지 달려 주실 수 있니? – Jim

+0

답장을 보내 주셔서 감사합니다. 귀하의 의견에 따라 코드를 업데이트했습니다. 아직 작동하지 않습니다. 네가 끝까지 달려 주실 수 있니? 오류 메시지 (메소드를 찾을 수 없음)를 표시하는 getWindow (parent1) 행이 있습니다. – Jim

+0

죄송합니다. 부모 컴포넌트가 아닌 클래스 윈도우를 확인하는 메소드입니다. 그렇지 않으면 부모가 null이거나 윈도우가 발견 될 때까지 getWindow를 다시 입력하십시오. – chillworld

1

나는 당신의 자식 창을 가정은 또 다른 창이다 모달 속성 : MVVM을 사용하는 경우 GlobalCommand를 사용하여 "r efresh "부모 창.통화를 추가 한 후 창을 닫 방법이있는 경우

@GlobalCommand 
public void refreshDropDown(){ 
    //Your code here 
} 

그리고 당신의 자식 창에서 : 당신의 부모 창에서

는 뷰 모델은 드롭 다운을 갱신하고 그 안에 @GlobalCommand 태그를 넣어하는 방법을 넣어

public void closeWindow(){ 
    //your code to close the window here 
    BindUtils.postGlobalCommand(null, null, "refreshDropDown", null); 
} 

또는 직접 자식 창 ZUL에 당신이 그것을 호출 할 수 있습니다 :

<button label="Close window" onClick="@command('close') @global-command('refresh')" /> 
그 globalCommand에

당신은에 대한 자세한 정보를 찾을 수 있습니다 here, herehere

+0

답장을 보내 주셔서 감사합니다. MVVM을 사용하지 않습니다. 어떻게 MVC에서 동일한 작업을 수행 할 수 있습니까? – Jim

관련 문제