MVVM アプリに 2 つの ViewModel があります。1 つはメイン ウィンドウにバインドされ、もう 1 つはボタンをクリックした後に表示されるポップアップ ウィンドウにバインドされます。ポップアップ ウィンドウで、メイン ウィンドウから選択したエンティティにバインドする必要があります。PopupViewModel から MainViewModel のこのエンティティにアクセスするにはどうすればよいですか?
2 に答える
ZK には、複数の ViewModel 間の通信のためのイベント キューとグローバル コマンドの概念があるため、それを使用して、現在選択されているエンティティをポップアップ ウィンドウの ViewModel に渡すことができます。
この zk mvvm デモ ページを使用する:
リストボックスに、ポップアップ ウィンドウで表示する必要があるメイン ViewModel の現在選択されているリマインダーを起動するグローバル コマンドを追加しました。
<listbox id="list" multiple="true" rows="6"
model="@load(vm.reminders)"
selectedItem="@bind(vm.selectedReminder)"
onSelect="@global-command('refresh', reminder=vm.selectedReminder)">
次に、ページの下部に、2 つ目の 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>
ポップアップ ビューモデルには、エンティティをパラメーターとして受け取るグローバル コマンドを受け入れるメソッドがあります。
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 で refresh メソッドが起動され、メイン ViewModel から取得したデータが渡されます。ページの下部にある [詳細] ボタンをクリックしてポップアップ ウィンドウを表示すると、現在選択されているエンティティの名前が表示されます。
これを行うために従ったドキュメントは次のとおりです。
(ドキュメント1 )
( docs2 )
そのサンプル アプリを実行する手順は、( Docs3 )の readme にあります。
メインウィンドウにエンティティのリストがありますか? その場合は、メイン ウィンドウのビュー モデルから、選択したエンティティをマップに配置し、次のように 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 の文字列が、マップに配置したキーであることがわかります。