属性 当调用事件侦听器注册的事件并更改视图模型的 属性 时,zul 视图中的绑定不会发生
Property bind in zul view not happening when event registered by event listner is called and changes the property of view model
我是新的zk框架。在我的 zul 文件中有一个通知计数指示器,它是一个 属性 视图模型并指示通知计数。当我点击通知指示器时,它会打开一个包含通知的开关 window。这里我想实现当我读到一个通知时,计数会减一。
<div class="notification_popup"
viewModel="@id('vm') @init('com.zk.viewmodels.ViewAnnouncementViewModel')">
<a sclass="activity-dropdown" id="announcement_notification" iconSclass="z-icon-bell" popup="ann_notification,position=after_end,type=toggle" tooltiptext="Notifications">
<span class="num"><label value="@bind(vm.announcementCount)"/></span></a>
<popup id="ann_notification" class="header-top-dropdown notification-dropdown">
<vlayout id="vl" sclass="notify-popup">
</vlayout>
</popup>
</div>
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ViewAnnouncementViewModel {
private long announcementCount = 0;
@NotifyChange({".", "announcementCount"})
public void setAnnouncementCount(long announcementCount) {
this.announcementCount = announcementCount;
}
@SuppressWarnings("unchecked")
@AfterCompose
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
super.afterCompose(view);
Selectors.wireComponents(view,this,false);
Html h1 = new Html();
h1.setContent("<h4>Notifications</h4>");
vl.appendChild(h1);
div = new Div();
div.setId("announcementList");
div = updateAnnouncement(div);
vl.appendChild(div);
}
public Div updateAnnouncement(Div div){
private Collection<AnnouncementResultDTO> searchResults =
announcementService.retrieveAnnouncement(instanceInfo);
announcementCount = searchResults.size();
setAnnouncementCount(announcementCount);
postNotifyChange(this,"announcementCount");
for(final AnnouncementResultDTO pasrDTO:searchResults){
A s1 = new A();
Label l1 = new Label();
l1.setValue("Annoncements");
s1.appendChild(l1);
div.appendChild(s1);
s1.addEventListener("onClick", new EventListener() {
public void onEvent(Event event) throws Exception {
Map<String, Object> map = new HashMap<String,Object>();
announcementCount=announcementCount-1;
setAnnouncementCount(announcementCount);
postNotifyChange(this,"*");
Window window = (Window) Executions.getCurrent().createComponents("announcement_popup.zul",null,map);
window.doModal();
}
});
}
}
但是当事件触发时 announcementCount 正在减少,但它没有反映在视图模型中。
我认为问题在于,如果我们调试并尝试找到值 'this',它将包含具有两个内部对象的对象,一个是视图模型。在这里我们可以理解 postnotify 方法接收的不是视图模型,而是包含视图模型作为内部 class 的包装器 class。我不知道我的假设是否正确。请帮助我
我找到了解决方案。在 onEvent() 方法中使用 postNotifyChange(ViewAnnouncementViewModel.this,""); 而不是 postNotifyChange(这,"");
s1.addEventListener("onClick", new EventListener() {
public void onEvent(Event event) throws Exception {
Map<String, Object> map = new HashMap<String,Object>();
announcementCount=announcementCount-1;
setAnnouncementCount(announcementCount);
postNotifyChange(ViewAnnouncementViewModel.this,"*");
Window window = (Window) Executions.getCurrent().createComponents("announcement_popup.zul",null,map);
window.doModal();
}
});
谢谢https://www.javacodegeeks.com/2012/07/zk-in-action-mvvm-working-together-with.html
尽管您已经找到通知 ViewModel 的正确方法 属性。但我建议您不要在同一范围内混合使用 MVVM 和 MVC 模式。因为MVVM是让ZK框架操作你的组件的模式,而MVC是你(应用程序开发者)自己通过组件API操作组件的模式。有时您的操作可能会干扰 ZK 框架的 MVVM 工作并产生意外结果。这种情况很难为您调试。 推荐一种模式一页。
例如,关于代码片段:
for(final AnnouncementResultDTO pasrDTO:searchResults){
A s1 = new A();
Label l1 = new Label();
....
如果需要根据一个集合创建多个组件,请使用
<forEach items="@load(vm.searchResults)">
<label value="Annoncements"
...
</forEach>
详情请见Shadow components。
我是新的zk框架。在我的 zul 文件中有一个通知计数指示器,它是一个 属性 视图模型并指示通知计数。当我点击通知指示器时,它会打开一个包含通知的开关 window。这里我想实现当我读到一个通知时,计数会减一。
<div class="notification_popup" viewModel="@id('vm') @init('com.zk.viewmodels.ViewAnnouncementViewModel')"> <a sclass="activity-dropdown" id="announcement_notification" iconSclass="z-icon-bell" popup="ann_notification,position=after_end,type=toggle" tooltiptext="Notifications"> <span class="num"><label value="@bind(vm.announcementCount)"/></span></a> <popup id="ann_notification" class="header-top-dropdown notification-dropdown"> <vlayout id="vl" sclass="notify-popup"> </vlayout> </popup> </div>
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ViewAnnouncementViewModel {
private long announcementCount = 0;
@NotifyChange({".", "announcementCount"})
public void setAnnouncementCount(long announcementCount) {
this.announcementCount = announcementCount;
}
@SuppressWarnings("unchecked")
@AfterCompose
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
super.afterCompose(view);
Selectors.wireComponents(view,this,false);
Html h1 = new Html();
h1.setContent("<h4>Notifications</h4>");
vl.appendChild(h1);
div = new Div();
div.setId("announcementList");
div = updateAnnouncement(div);
vl.appendChild(div);
}
public Div updateAnnouncement(Div div){
private Collection<AnnouncementResultDTO> searchResults =
announcementService.retrieveAnnouncement(instanceInfo);
announcementCount = searchResults.size();
setAnnouncementCount(announcementCount);
postNotifyChange(this,"announcementCount");
for(final AnnouncementResultDTO pasrDTO:searchResults){
A s1 = new A();
Label l1 = new Label();
l1.setValue("Annoncements");
s1.appendChild(l1);
div.appendChild(s1);
s1.addEventListener("onClick", new EventListener() {
public void onEvent(Event event) throws Exception {
Map<String, Object> map = new HashMap<String,Object>();
announcementCount=announcementCount-1;
setAnnouncementCount(announcementCount);
postNotifyChange(this,"*");
Window window = (Window) Executions.getCurrent().createComponents("announcement_popup.zul",null,map);
window.doModal();
}
});
}
}
但是当事件触发时 announcementCount 正在减少,但它没有反映在视图模型中。 我认为问题在于,如果我们调试并尝试找到值 'this',它将包含具有两个内部对象的对象,一个是视图模型。在这里我们可以理解 postnotify 方法接收的不是视图模型,而是包含视图模型作为内部 class 的包装器 class。我不知道我的假设是否正确。请帮助我
我找到了解决方案。在 onEvent() 方法中使用 postNotifyChange(ViewAnnouncementViewModel.this,""); 而不是 postNotifyChange(这,"");
s1.addEventListener("onClick", new EventListener() {
public void onEvent(Event event) throws Exception {
Map<String, Object> map = new HashMap<String,Object>();
announcementCount=announcementCount-1;
setAnnouncementCount(announcementCount);
postNotifyChange(ViewAnnouncementViewModel.this,"*");
Window window = (Window) Executions.getCurrent().createComponents("announcement_popup.zul",null,map);
window.doModal();
}
});
谢谢https://www.javacodegeeks.com/2012/07/zk-in-action-mvvm-working-together-with.html
尽管您已经找到通知 ViewModel 的正确方法 属性。但我建议您不要在同一范围内混合使用 MVVM 和 MVC 模式。因为MVVM是让ZK框架操作你的组件的模式,而MVC是你(应用程序开发者)自己通过组件API操作组件的模式。有时您的操作可能会干扰 ZK 框架的 MVVM 工作并产生意外结果。这种情况很难为您调试。 推荐一种模式一页。
例如,关于代码片段:
for(final AnnouncementResultDTO pasrDTO:searchResults){
A s1 = new A();
Label l1 = new Label();
....
如果需要根据一个集合创建多个组件,请使用
<forEach items="@load(vm.searchResults)">
<label value="Annoncements"
...
</forEach>
详情请见Shadow components。