在使用按钮将新模型设置到网格后,为什么不会触发事件触发?

时间:2015-03-15 18:45:27

标签: java model-view-controller zk

我有一个网格,每行有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());
    }

}

2 个答案:

答案 0 :(得分:0)

通常,所有事件侦听器都附加到MVC框架中的模型。

因此,如果您替换模型,那么在旧模型发生更改的情况下,侦听器仍然可以工作。

您必须为新模型再次设置所有侦听器(并从旧模型中移除它们(在大多数情况下由框架完成))以使其正常工作。

答案 1 :(得分:0)

问题是,您的组件(Window)已在更改模型时创建。因此,请不要致电doAfterCompose,并且不会为组件/事件列表人员做好准备。

应该起作用的是触发模型构造函数中onCreate的{​​{1}}事件(未测试)

Window

但在我看来这是不好的做法 更正确的是操纵模型。

相关问题