ZK MVVM:使用<include>将参数传递给另一个视图模型

时间:2015-07-06 08:48:40

标签: mvvm zk

我想要做的是将值从page1.zul传递到page2.zul<include>viewModel

来自page1.zul,我有

<include processId="@bind(vm.selectedProcess.id)" src="@load('page2.zul')"></include>

然后它应传递到viewModel

中的page2.zul
@Init
public void init(@ExecutionArgParam("processId") String processId){
    System.out.println("processInstanceId : " + processId);
}

但是,我总是得到一个空值。知道如何做这件事吗? page2.zul看起来像这样:

<div apply="org.zkoss.bind.BindComposer"
    viewModel="@id('vm') @bind('com.mrye.viewModel')">

    <label value="@load(vm.processId)"></label>
</div>

3 个答案:

答案 0 :(得分:1)

首先,要区分VM的Id。

然后zul:

<div apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('com.mrye.viewModel', processId = parentVM.selectedProcess.id )">

和VM2:

@Init
public void init (@BindingParam("processId") MyObject processID) {

评论后编辑:

正如您在this fiddle中看到的那样,但是您的参数必须初始化。

如果你想拥有&#34;实时数据&#34;传递给其他zul(不是其他viewmodel),你可以使用@ref或只使用parentVM 如果实时数据需要在viewmodel本身中,您可以使用一个不可见的文本框,从parentVM中加载数据,并在某些操作发生之前将其保存在includedVM中。

请在此处查看updated fiddle

答案 1 :(得分:1)

您可以在这里查看

Index.zul

<?page title="URL Parameters Test" contentType="text/html;charset=UTF-8"?>  
<zk>  
<window title="URL Parameters Test" border="normal">  

    <include src="header.zul?test=5" />  

</window>  
</zk>  

在上面的代码中,您可以通过URL检查它是否传递参数test test is argument name and value = 5

<?page contentType="text/html;charset=UTF-8"?>
<zk>
<window border="none" width="100%" height="100%" apply="pkg$.HeaderComposer">

<label id="lblHeader" />

<div>
Load from EL [ <label value="${param.test}" />]
</div>
</window>
</zk>

在这个页面中,我们使用${param.test}来获取在index.zul中传递的参数,HeaderComposer.java

import org.zkoss.zk.ui.*;  
import org.zkoss.zk.ui.event.*;  
import org.zkoss.zk.ui.util.*;  
import org.zkoss.zk.ui.ext.*;  
import org.zkoss.zk.au.*;  
import org.zkoss.zk.au.out.*;  
import org.zkoss.zul.*;  

public class HeaderComposer extends GenericForwardComposer{  


    Label lblHeader;  

    @Override  
    public void doAfterCompose(Component comp) throws Exception {  

        try {  
            super.doAfterCompose(comp);  
        }   
        catch (Exception e) {  
            e.printStackTrace();  
        }  

        /* 
         * retrieve url parameters 
         */  
        String[] parameter = (String[]) param.get("test");  

        if (parameter != null)  
            lblHeader.setValue( "Congratulations! Your parameters value is " + parameter[0] );  
        else  
            lblHeader.setValue( "No parameters found. URL should be something like http://yourserver/yoursite/main.zul?parameter=param-value" );  
    }  
}

您可以通过更多方式查看http://zkframeworkhint.blogspot.in/2014/05/zk-include-how-to-pass-and-get.html

答案 2 :(得分:0)

确保在VM1上正确初始化值vm.selectedProcess.id并且它有一个值,在VM2中添加@AfterCompose生命周期注释然后在@Init获取值,根据您的这应该适用于VM2:

   Long processId;

   @AfterCompose
   public void initAfterCompose(@ContextParam(ContextType.VIEW) Component view) {
       Selectors.wireComponents(view, this, false);
   }

   @Init
   public void init() {
       //get dynamic attribut
       processId = (Long) Executions.getCurrent().getAttribute("processId");
   }