java - 当调用事件列表器注册的事件并更改视图模型的属性时,zul 视图中的属性绑定不会发生
问题描述
我是新的 zk 框架。在我的 zul 文件中有一个通知计数指示器,它是视图模型的属性,指示通知计数。当我单击通知指示器时,它会打开一个包含通知的切换窗口。在这里我想实现当我阅读通知时,计数将减一。
<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 方法接收的不是视图模型,而是包含视图模型作为内部类的包装类。我不知道我的假设是否正确。请帮我
解决方案
尽管您已经找到了通知 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>
有关详细信息,请参阅阴影组件。
推荐阅读
- sql - Oracle 多个“with as”问题
- jquery - 如果选中,引导无线电组更改背景颜色
- mysql - 删除数据库命令后恢复 Mysql 数据库
- php - PHP表单未将文件附加到电子邮件
- active-directory - AD 扩展未在 MicrosoftGraph 中列出,但仍可用
- javascript - 循环单选按钮
- angular - 我有一个在 IE9 及更高版本上运行良好的 Angular 应用程序,但在 IE8 上无法正常运行
- java - 使用 proguard 编译项目 netbeans 时出错
- bluetooth - 来自蓝牙 OBEX 连接请求的响应是 HTTP 不可接受
- node.js - 错误:交易被拒绝,非错误:未定义