首页 > 解决方案 > 当调用事件列表器注册的事件并更改视图模型的属性时,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 方法接收的不是视图模型,而是包含视图模型作为内部类的包装类。我不知道我的假设是否正确。请帮我

标签: javazk

解决方案


尽管您已经找到了通知 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>

有关详细信息,请参阅阴影组件


推荐阅读