Struts2 jQuery插件Doubleselect第二个下拉列表的初始值

时间:2013-12-30 21:08:52

标签: javascript jquery struts2-jquery-plugin

我有一点(我希望)试图使用Struts2 jQuery插件中的Doubleselect元素。我没有问题跟随sample,当我添加新记录(向数据库添加新记录)时,行为是预期的,但是当我尝试编辑现有记录时,第二个选择不加载存储的值正在编辑的记录。

任何帮助?

代码和配置如下:

JSP代码

<s:form id="ingresoForm" action="saveIngreso" method="post" validate="true" cssClass="well form-horizontal">
    <s:hidden key="ingreso.id"/>
    <s:hidden key="cliente" id="cliente"/>

    <div class="type-text">
            <label for="cliente">Cliente: </label>
            <s:url var="remoteurl" action="ajax/clienteProyectoSelectSource"/>
            <sj:select
                href="%{remoteurl}"
                id="clienteSelect"
                onChangeTopics="reloadsecondlist"
                name="ingreso.cliente.id"
                list="clientes"
                listKey="id"
                listValue="nombre"
                emptyOption="false"
                headerKey="-10"
                headerValue="Por favor seleccione un cliente"/>
        </div>
        <div class="type-text">
            <label for="Proyecto">Proyecto: </label>
            <sj:select
                href="%{remoteurl}"
                id="proyectoSelect"
                formIds="ingresoForm"
                reloadTopics="reloadsecondlist"
                name="ingreso.proyecto.id" 
                list="proyectos"
                listKey="id"
                listValue="nombre"
                emptyOption="false"
            />
        </div>

行动守则

public class ClienteProyectoSelectSourceAjaxAction extends BaseAction {

private List<Cliente> clientes;
private List<Proyecto> proyectos;
private String cliente;
private GenericManager<Cliente, Long> clienteManager;


@Override
public String execute() {

    clientes = clienteManager.getAll();

    if (cliente != null && cliente.length() > 0 && !cliente.equals("-10")) {
        proyectos = clienteManager.get(new Long(cliente)).getProyectos();
    }
    return Action.SUCCESS;
}

行动宣言

<package name="example" extends="json-default"  namespace="/ajax">
    <action name="clienteProyectoSelectSource" class="com.queres.smtm.webapp.action.ajax.ClienteProyectoSelectSourceAjaxAction">
        <result type="json"/>
    </action>
</package>

Ingreso实体(模型)

@Entity
@Table(name = "ingreso")
public class Ingreso extends BaseObject {

// Campos comunes
private Long id;
private TipoIngreso tipo;
private String observaciones;
private BigDecimal importe;
private BigDecimal tipoIVA;
private Date fechaPrevistaCobro;
private Date fechaEfectivaCobro;

// Campos para facturas
private String numeroFactura;
private Cliente cliente;
private Proyecto proyecto;
private TipoServicio servicio;
private Date fechaEmision;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}


@Enumerated(EnumType.STRING)
public TipoIngreso getTipo() {
    return tipo;
}

public void setTipo(TipoIngreso tipo) {
    this.tipo = tipo;
}

public String getObservaciones() {
    return observaciones;
}

public void setObservaciones(String observaciones) {
    this.observaciones = observaciones;
}

public BigDecimal getImporte() {
    return importe;
}

public void setImporte(BigDecimal importe) {
    this.importe = importe;
}

public BigDecimal getTipoIVA() {
    return tipoIVA;
}

public void setTipoIVA(BigDecimal tipoIVA) {
    this.tipoIVA = tipoIVA;
}

@Temporal(javax.persistence.TemporalType.DATE)
@Field
public Date getFechaPrevistaCobro() {
    return fechaPrevistaCobro;
}

public void setFechaPrevistaCobro(Date fechaPrevistaCobro) {
    this.fechaPrevistaCobro = fechaPrevistaCobro;
}

@Temporal(javax.persistence.TemporalType.DATE)
@Field
public Date getFechaEfectivaCobro() {
    return fechaEfectivaCobro;
}

public void setFechaEfectivaCobro(Date fechaEfectivaCobro) {
    this.fechaEfectivaCobro = fechaEfectivaCobro;
}

public String getNumeroFactura() {
    return numeroFactura;
}

public void setNumeroFactura(String numeroFactura) {
    this.numeroFactura = numeroFactura;
}

@ManyToOne
public Cliente getCliente() {
    return cliente;
}

public void setCliente(Cliente cliente) {
    this.cliente = cliente;
}

@ManyToOne
public Proyecto getProyecto() {
    return proyecto;
}

public void setProyecto(Proyecto proyecto) {
    this.proyecto = proyecto;
}

@Enumerated(EnumType.STRING)
public TipoServicio getServicio() {
    return servicio;
}

public void setServicio(TipoServicio servicio) {
    this.servicio = servicio;
}

@Temporal(javax.persistence.TemporalType.DATE)
@Field
public Date getFechaEmision() {
    return fechaEmision;
}

public void setFechaEmision(Date fechaEmision) {
    this.fechaEmision = fechaEmision;
}

@Override
public int hashCode() {
    int hash = 3;
    hash = 43 * hash + (this.numeroFactura != null ? this.numeroFactura.hashCode() : 0);
    hash = 43 * hash + (this.fechaEmision != null ? this.fechaEmision.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final Ingreso other = (Ingreso) obj;
    if ((this.numeroFactura == null) ? (other.numeroFactura != null) : !this.numeroFactura.equals(other.numeroFactura)) {
        return false;
    }
    if (this.fechaEmision != other.fechaEmision && (this.fechaEmision == null || !this.fechaEmision.equals(other.fechaEmision))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "Ingreso{" + "id=" + id + ", tipo=" + tipo + ", observaciones=" + observaciones + ", importe=" + importe + ", tipoIVA=" + tipoIVA + ", fechaPrevistaCobro=" + fechaPrevistaCobro + ", fechaEfectivaCobro=" + fechaEfectivaCobro + ", numeroFactura=" + numeroFactura + ", cliente=" + cliente + ", proyecto=" + proyecto + ", servicio=" + servicio + ", fechaEmision=" + fechaEmision + '}';
}

}

提前谢谢

1 个答案:

答案 0 :(得分:0)

问题解决了。似乎jquery-plugin工作得很好,像往常一样,错误发生在键盘和椅子之间......

我忘了为第二个选择加载数据列表,因此jquery无法选择适当的值。

因此,解决方案是确保在用户编辑元素时加载第二个列表(proyectos)。

我在JSP上添加了一个标志(cliente)作为隐藏元素并从主操作中预加载它,因此我可以从Ajax Action中检查是否需要填充第二个列表。

Ingreso Action(视图的主要操作)

public class IngresoAction extends BaseAction implements Preparable {

private String cliente;

public String edit() {
    if (id != null) {
        ingreso = ingresoManager.get(id);
        cliente = Long.toString(ingreso.getCliente().getId());

    } else {
        ingreso = new Ingreso();
    }

    return SUCCESS;
}

public String getCliente() {
    return cliente;
}

public void setCliente(String cliente) {
    this.cliente = cliente;
}

<...>