2014-01-09 94 views
1

我是ZK的新手。ZK如何將參數從java代碼傳遞給zk頁面?

我使用很老的zk框架版本(遺留項目)。

我呈現ZK頁面,以便:

Executions.createComponents("/myZul.zul", null, null)) 

我需要傳遞參數ZUL。如果參數是真實的,我需要渲染複選框,否則 - 而不是在myZul.zul

我需要ZUL是這樣的:

if(parameter){ 

    <checkbox id="my_id" label="my checkbox" /> 
} 

UPDATE 我ZUL:

<window xmlns="http://www.zkoss.org/2005/zul" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:h="http://www.w3.org/1999/xhtml" 
     xmlns:zk="http://www.zkoss.org/2005/zk" 
     xmlns:ca="http://www.zkoss.org/2005/zk/client" 
     xsi:schemaLocation="http://www.zkoss.org/2005/zul  http://www.zkoss.org/2005/zul/zul.xsd " 
     border="normal" 
     closable="false" 
     position="center,center" 
     width="383px" 
     height="270px" 
     onCancel="self.detach();" 
     id="decisionCommentWindow" 
     title="${c:l('approvalTaskWindow.title')}" 
     use="handlers.ZulHandler"> 
     .... 

我需要在ZulHandler中覆蓋方法doAfterCompose

再來一次:

ZUL:

<window xmlns="http://www.zkoss.org/2005/zul" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:h="http://www.w3.org/1999/xhtml" 
     xmlns:zk="http://www.zkoss.org/2005/zk" 
     xmlns:ca="http://www.zkoss.org/2005/zk/client" 
     xsi:schemaLocation="http://www.zkoss.org/2005/zul http://www.zkoss.org/2005/zul/zul.xsd " 
     border="normal" 
     closable="false" 
     position="center,center" 
     width="383px" 
     height="270px" 
     onCancel="self.detach();" 
     id="decisionCommentWindow" 
     title="${c:l('approvalTaskWindow.title')}" 
     use="handlers.ZulHandler"> 


    <zk if="${isManufacturingKey}"> 

     <checkbox id="checkbox_id" label="check" /> 

    </zk> 






</window> 

ZUL創世:

... 
Map args = new HashMap<String, Boolean>(); 
        Boolean isManufacturing = true; 
        args.put("isManufacturingKey", isManufacturing); 
        ZulHandler window = Preconditions 
          .checkNotNull((ZulHandler) Executions.createComponents(
            "/decision_comment_window.zul", null, args)); 
        window.setTitle(decisionModel.getName() + " decision"); 
        if (isManufacturing) { 
         Checkbox checkbox = (Checkbox) Path 
           .getComponent("/decisionCommentWindow/emergency_change_checkbox_id"); 
         checkbox.setChecked(workflow.getEmergencyChange());//I have Null pointer here because checkbox is null 
        } 
... 
+0

發佈或獲取參數? – chillworld

+0

您在zulhandlers中實施或擴展了哪些課程? – chillworld

+0

*延伸窗口* – gstackoverflow

回答

-4

java代碼:

Map args = new HashMap<String, Boolean>(); 
args.put("isManufacturingKey", true); 
ZulHandler window = Preconditions.checkNotNull((ZulHandler) Executions.createComponents("/decision_comment_window.zul", null, args)); 

在.zul文件的訪問權:

"${arg.isManufacturingKey}" 

注:我訪問使用ARG訪問到參數

它正在爲我的ZK版本工作!

+0

我已經編輯了我的答案,我認爲現在很清楚 – gstackoverflow

+0

當然這可行,但不好的做法是要求arg在祖爾。 如果你不通過參數,你的輸出是什麼,因爲這可以用在其他情況下? 請確保在您的代碼中執行此操作。 – chillworld

+0

在這種情況下,我沒有看到複選框 – gstackoverflow

8

你可以這樣做:

HashMap map = new HashMap<String, String>(); 
Boolean isManufacturing = true; 
args.put("isManufacturingKey", isManufacturing); 
map.put("isManufactringChecked",workflow.getEmergencyChange()); 
Executions.createComponents("/myZul.zul", null , map); 

創建這個控制器:

public class ZulHandler extends SelectorComposer { 

    @Wire("#win") 
    private Window myWin; 
    private Boolean manufacturing; 
    private Boolean manufactringChecked; 
    @Override 
    public void doAfterCompose(Component window) throws Exception { 
    super.doAfterCompose(window); 

    if (arg.containsKey("isManufacturingKey")) { 
     manufacturing = (Boolean) arg.get("isManufacturingKey")); 
    } else { 
     //Declare what is is when you don't have the arg 
    } 
    if (arg.containsKey("isManufactringChecked")) { 
     manufactringChecked = (Boolean) arg.get("isManufactringChecked")); 
    } else { 
     //Declare what is is when you don't have the arg 
    } 
} 

public Boolean isManufacturing() { 
    return manufacturing; 
} 

public Boolean isManufactringChecked() { 
    return manufactringChecked ; 
} 

改變您的ZUL從這個:

use="handlers.ZulHandler"> 
<zk if="${isManufacturingKey}"> 
    <checkbox id="checkbox_id" label="check" /> 
</zk> 

到:

apply="handlers.ZulHandler"> 
<checkbox id="checkbox_id" label="check" checked="${$composer.manufactringChecked}" 
    visible="${$composer.manufacturing}"/> 

現在你只需要在那裏實現doOk方法。 如果它的一個按鈕,只要關閉該窗口,你可以做在ZUL如下:

<button label="Close" onClick="spaceOwner.detach()" /> 

編輯:
礦第一個解決方案是爲你的問題是正確的。你只是有下一個問題,因爲你工作錯了。 你的問題是你想讓你的調用者影響目標。 只需給予參數,讓你的目標控制器做的工作。
它就像一個汽車工廠,他們說你的車可以行駛200km/hr,但是你作爲汽車的控制者,你是否以200公里/小時的速度行駛,或者當你沒有指定時,你還能駕駛汽車嗎?
您也不需要爲同一問題製作dubbelposts。你可以爲空指針創建一個問題,但是標題幾乎是一樣的,而且帖子裏的內容也是如此。

編輯:

如果需要設置標題=>把標題中指定參數和要求,在你的代碼。 否則,我編輯控制器類,所以你有你的窗口變量(或你要讓自己變成公共的getter和setter的窗口)

+1

* arg *是什麼? – gstackoverflow

+0

如果您從GenericForwardComposer中的doAfterCompose(...)調用super.doAfterCompose(comp),則會爲您自動裝配args變量。因此,它將具有作爲Executions.createComponents(...)的第三個參數傳遞的所有值。 – chillworld

+0

我有問題。請閱讀我的話題更新。 – gstackoverflow

0

我創建了一個zul並在主zul中設置了arg。發送一個參數,我想改變這個參數。 例如:

Map args = new HashMap<String, Boolean>(); 
args.put("ReadOnly", false); 
Executions.createComponents("/example.zul", null, args); 

如果我保存按鈕cliked和改變只讀真實,如何改變main.zul只讀;