如何从ZK-Framework中的另一个ViewModel获取ViewModel

时间:2012-07-16 13:27:35

标签: mvvm zk

我的MVVM应用程序中有两个ViewModel。一个是绑定到主窗口,另一个是弹出窗口,单击按钮后出现。在弹出窗口中,我需要从主窗口绑定到所选实体。如何从PopupViewModel中访问MainViewModel中的这个实体?

2 个答案:

答案 0 :(得分:5)

ZK具有事件队列和全局命令的概念,用于多个ViewModel之间的通信,因此我们可以使用它将当前选定的实体传递给弹出窗口的ViewModel。

使用此zk mvvm演示页:

see docs

我在列表框中添加了一个全局命令,该命令会弹出当前所选的主ViewModel提醒,需要通过弹出窗口显示:

    <listbox id="list" multiple="true" rows="6"
        model="@load(vm.reminders)"
        selectedItem="@bind(vm.selectedReminder)" 
        onSelect="@global-command('refresh', reminder=vm.selectedReminder)">

然后我在页面底部添加了一个带有第二个ViewModel的弹出窗口:

    <window id="info" visible="false" width="120px" border="normal" position="parent"
     apply="org.zkoss.bind.BindComposer"
    viewModel="@id('vm') @init('org.zkforge.zktodo2.ui.ViewModelPopup')"
    >
You have selected <label value="@load(vm.currentReminder.name)"/>
</window>
<button label="More info" onClick="info.doPopup()"/>
</zk>

弹出Viewmodel有一个接受全局命令的方法,该命令将实体作为参数:

public class ViewModelPopup  {

    protected Reminder currentReminder = new Reminder();

    public Reminder getCurrentReminder() {
        return currentReminder;
    }

    public void setCurrentReminder(Reminder currentReminder) {
        this.currentReminder = currentReminder;
    }

    @GlobalCommand @NotifyChange("currentReminder")
    public void refresh(@BindingParam("reminder") Reminder reminder ){
        this.setCurrentReminder(reminder);
        return;
    }

}

现在,无论何时在列表框中选择一个项目,都会在弹出的ViewModel上触发刷新方法,从而将从主ViewModel中获取的数据传递给它。每当您点击页面底部的“更多信息”按钮以显示弹出窗口时,它将显示当前所选实体的名称。

我执行此操作的文档位于:

docs1

docs2

运行该示例应用程序的说明位于(Docs3

的自述文件中

答案 1 :(得分:1)

您的主窗口中是否有实体列表?如果是这种情况,从主窗口的视图模型中,您需要将所选实体放在地图中,并将其作为createComponents的参数传递,如下所示:

//In the view Model of the main window 
Map arg = new HashMap();
arg.put("selectedEntity", SelectedEntity);
Executions.createComponents("/myPopup.zul", null, arg);

现在在弹出视图模型中,您只需在Init方法中检索实体的值:

    //PopupView model
    @Init
    public void init(@ExecutionArgParam("selectedEntity") SelectedEntity newEntity)           {

    entity = newEntity;


}

你可以注意到ExecutionArgParam中的字符串是你放在地图中的键。