我有一个网格,每行有2个按钮,用于编辑和删除。当我将新模型设置到网格时,按钮不会触发onClick事件,因此我可以在编辑器中处理它。我不想使用MVVM模式,我想使用MVC模式。我想知道在将新模型设置到网格后如何使按钮起作用。
这是我的ZUL文件:
<?page title="ZK Application" contentType="text/html;charset=UTF-8"?>
<zk>
<window id="win" title="new page title" border="normal" apply="com.example.zk.controllers.ActorController">
<intbox id="txtActorId" visible="false" value="-1"></intbox>
<label value="First Name"></label><textbox id="txtFirstName"></textbox>
<label value="Last Name"></label><textbox id="txtLastName"></textbox>
<button id="btnSave" label="Save"/>
<button id="btnClear" label="Clear" />
<button id="btnDeleteAll" label="Delete All"/>
<grid id="grdActors" model="${win$composer.actorsModel }">
<columns>
<column label="ID" />
<column label="First Name" />
<column label="Last Name" />
<column/>
</columns>
<template name="model" var="actor">
<row value="valor${each.actorId }">
<label value="${each.actorId }" />
<label value="${each.firstName }" />
<label value="${each.lastName }" />
<button id="btnEdit${each.actorId }" label="Edit" >
<custom-attributes actor="${each }" action="edit"/>
</button>
<button id="btnDelete${each.actorId }" label="Delete">
<custom-attributes actor="${each }" action="delete"/>
</button>
</row>
</template>
</grid>
</window>
</zk>
这是我的作曲家:
package com.example.zk.controllers;
import java.util.Date;
import java.util.List;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;
import com.example.zk.dao.ActorDAO;
import com.example.zk.entities.Actor;
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ActorController extends SelectorComposer<Component> {
private static final long serialVersionUID = 1L;
@WireVariable("actorDao")
ActorDAO dao;
@Wire
Textbox textBox;
@Wire
Combobox cbxActors;
@Wire
Textbox txtFirstName;
@Wire
Textbox txtLastName;
@Wire
Intbox txtActorId;
@Wire
Grid grdActors;
public List<Actor> getActors(){
return dao.getAllActors();
}
public ListModel<Actor> getActorsModel(){
return new ListModelList<>(getActors());
}
@Listen("onClick=#btnSave")
public void saveActor(){
Actor actor = new Actor((short) txtActorId.getValue().intValue(), txtFirstName.getValue(), txtLastName.getValue(), new Date());
dao.saveActor(actor);
refreshGrid();
clearAll();
}
@Listen("onClick=#grdActors button")
public void editActor(Event event){
Actor actor = (Actor) event.getTarget().getAttribute("actor");
if(((String) event.getTarget().getAttribute("action")).equalsIgnoreCase("delete")){
deleteActor(actor);
return;
}
txtActorId.setValue((int)actor.getActorId());
txtFirstName.setValue(actor.getFirstName());
txtLastName.setValue(actor.getLastName());
}
public void deleteActor(Actor actor){
// Actor actor = (Actor) event.getTarget().getAttribute("actor");
dao.delete(actor);
refreshGrid();
}
@Listen("onClick=#btnDeleteAll")
public void deletaAll(){
dao.deleteAll();
refreshGrid();
}
@Listen("onClick=#btnClear")
public void clearAll(){
txtActorId.setValue(0);
txtFirstName.setValue("");
txtLastName.setValue("");
}
public void refreshGrid(){
grdActors.setModel(getActorsModel());
}
}
答案 0 :(得分:0)
通常,所有事件侦听器都附加到MVC框架中的模型。
因此,如果您替换模型,那么在旧模型发生更改的情况下,侦听器仍然可以工作。
您必须为新模型再次设置所有侦听器(并从旧模型中移除它们(在大多数情况下由框架完成))以使其正常工作。
答案 1 :(得分:0)
问题是,您的组件(Window
)已在更改模型时创建。因此,请不要致电doAfterCompose
,并且不会为组件/事件列表人员做好准备。
应该起作用的是触发模型构造函数中onCreate
的{{1}}事件(未测试)
Window
但在我看来这是不好的做法 更正确的是操纵模型。