我需要两次单击按钮才能进行计算

时间:2014-09-09 17:33:30

标签: jsf primefaces

我有一种计算费用的方法,但你需要点击两次按钮才能计算

  1. 这是获取数据库中的数据并计算

    的方法
    public Float findTarifaBandeira1() {
        try {
            //SQL
        } catch (NoResultException ne) {
            System.out.print("Tarifa não encontrada"); // Colocar messagesfaces
        }
    
        tarifaBand1 = (bandeira.getValorInicial()  + ( bandeira.getTarifaCorrida().getValorKm() * km));
        BigDecimal vt = new BigDecimal(tarifaBand1).setScale(2, RoundingMode.HALF_EVEN);
        tarifaBand1 = vt.floatValue();
        return tarifaBand1;
    }
    
  2. 此方法触发按钮的单击调用其他方法和上述方法 我有一个计算费用的方法,但你需要点击两次按钮才能计算

    public void consultarBandeira() throws ParseException {
        getData();
        getHora();
        convertDistance();
        findTarifaBandeira1();
        findTarifaBandeira2();
        findTarifaVolumesDeMao ();
        findTarifaVolumesNormais ();
        findTarifaVolumesGrandes();
    }
    
  3. 在我的JSF页面中,我使用远程命令来调用上面的方法

    <p:commandButton value="#{msg['btn-search']}"
                     styleClass="btn btn-primary" onclick="findRoute()"/>
    
    <p:remoteCommand actionListener="#{searchBean.consultarBandeira()}"
                     id="consultaValor" name="consultaValor"
                     update="bandeira1, bandeira2, nomeVPequenos,
                             descricaoVPequenos, valorVpequenos, nomeVNormais,
                             descricaoVNormais, valorVNormais, nomeVGrandes,
                             descricaoVGrandes, valorVGrandes"/>    
    

    findRoute()是一个调用JavaScript consultaValor组件的函数,该组件触发了searchBean中的方法。

    function findRoute(){
        event.preventDefault();
    
        var addressOrigin = origin;
        var addressDestination = document.getElementById("addr").value + 
                                   document.getElementById("city").value;
    
        var request = {
            origin: addressOrigin,
            destination: addressDestination,
            travelMode: google.maps.TravelMode.DRIVING,
            unitSystem: google.maps.UnitSystem.metric 
        };
    
        directionsService.route(request, function(response, status) {
            if (status == google.maps.DirectionsStatus.OK) {
                directionsDisplay.setDirections(response);
                directionsDisplay.setPanel(document.getElementById("route"));
                var route = response.routes[0];
                for (var i = 0; i < route.legs.length; i++){
                    routeSegment = i + 1;
                    distance = route.legs[i].distance.value;
                }
                document.getElementById("distance").value = distance;
            }
        }); 
        consultaValor();
    }   
    

1 个答案:

答案 0 :(得分:0)

当你单击commandButton时,它会对服务器进行两次回发:一次用于remoteCommand,一次用于按钮本身。这很可能是导致问题的原因。

由于您实际上只是使用该按钮进行客户端操作,因此请指示您的commandButton不要通过onclick进行回发。

此外,由于您在findRoute()javascript方法中设置表单数据,因此您需要确保在后端处理它。 remoteCommand的进程的默认值是@this。

<p:commandButton value="#{msg['btn-search']}"
             styleClass="btn btn-primary" onclick="findRoute(); return false"/>
<p:remoteCommand actionListener="#{searchBean.consultarBandeira()}"
             id="consultaValor" name="consultaValor"
             process="@form"
             update="bandeira1, bandeira2, nomeVPequenos,
                     descricaoVPequenos, valorVpequenos, nomeVNormais,
                     descricaoVNormais, valorVNormais, nomeVGrandes,
                     descricaoVGrandes, valorVGrandes"/>    

但如果是我,我会通过将逻辑组合到命令按钮本身来简化这一点:

<p:commandButton value="#{msg['btn-search']}"
             styleClass="btn btn-primary" onstart="findRoute()"
             action="#{searchBean.consultarBandeira()}"
             process="@form"
             update="bandeira1, bandeira2, nomeVPequenos,
                     descricaoVPequenos, valorVpequenos, nomeVNormais,
                     descricaoVNormais, valorVNormais, nomeVGrandes,
                     descricaoVGrandes, valorVGrandes" />