【问题标题】:how to get a ViewModel from another ViewModel in ZK-Framework如何从 ZK-Framework 中的另一个 ViewModel 获取 ViewModel
【发布时间】:2012-07-16 13:27:35
【问题描述】:

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

【问题讨论】:

    标签: mvvm zk


    【解决方案1】:

    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) 的自述文件中

    【讨论】:

      【解决方案2】:

      您的主窗口中有实体列表吗?如果是这种情况,则需要从主窗口的视图模型中将所选实体放入地图中,并将其作为 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 中的字符串是您放入映射中的键。

      【讨论】:

        猜你喜欢
        • 2020-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-04
        相关资源
        最近更新 更多