2014-10-18 5 views
0

입력이 클라이언트 측에 있고 믹스에서 Confirm을 누른 후에 onSuccess 함수가 호출되기 때문에 입력란을 설정할 수없는 매우 이상한 상황이 있습니다. 되돌릴 수 없으며 앞으로 나아갈 수 없습니다.Tapestry의 대화 상자 확인

나는 확인을 누르면 확인 대화 상자가 열립니다. 그러나 여기 값은 아직 설정되지 않았으므로 (Confirm 대화 상자에서 Submit를 기다리고 있습니다) null 값과 0 값을 얻습니다.이 상황을 제거하는 방법을 제안 해 주시겠습니까? 또한 문제가되는 것은 대화 모드 일 때 확인 버튼을 클릭 할 수없고 그 이유가 무엇인지 알지 못합니다.

도움 주셔서 감사합니다.

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package rs.domaci.pages; 

import org.apache.commons.lang.StringUtils; 
import org.apache.tapestry5.ComponentResources; 
import org.apache.tapestry5.EventConstants; 
import org.apache.tapestry5.PersistenceConstants; 
import org.apache.tapestry5.alerts.AlertManager; 
import org.apache.tapestry5.annotations.Component; 
import org.apache.tapestry5.annotations.InjectComponent; 
import org.apache.tapestry5.annotations.OnEvent; 
import org.apache.tapestry5.annotations.Persist; 
import org.apache.tapestry5.annotations.Property; 
import org.apache.tapestry5.corelib.components.Form; 
import org.apache.tapestry5.corelib.components.Zone; 
import org.apache.tapestry5.hibernate.annotations.CommitAfter; 
import org.apache.tapestry5.ioc.annotations.Inject; 
import org.apache.tapestry5.json.JSONObject; 
import org.apache.tapestry5.services.ComponentSource; 
import org.apache.tapestry5.services.Request; 
import org.apache.tapestry5.services.ajax.AjaxResponseRenderer; 
import org.hibernate.Session; 
import rs.domaci.entities.Tiket; 
import rs.domaci.entities.TiketStatus; 
import rs.domaci.entities.TipDrawTiketa; 

/** 
* This page is for generating tickets! 
* 
* @author 
*/ 
public class AddTickets { 

    @Property 
    private String drawNumberOfTicket; 
    @Inject 
    private Session hibernate; 
    @Property 
    private int series; 
    @Property 
    @Persist(PersistenceConstants.CLIENT) 
    private String datum; 
    @Inject 
    private ComponentSource componentSource; 
    @Property 
    // price 
    private int cijena; 
    @Property 
    @Persist 
    private String kopijaDatum; 
    @Property 
    @Persist 
    private int kopijaBroj; 
    /** 
    * @Property private 
    */ 
    @Property 
    @Persist(PersistenceConstants.CLIENT) 
    private int broj; 
    @Property 
    @Persist(PersistenceConstants.FLASH) 
    private int brojTiketa; 
    @Property 
    private TiketStatus status = TiketStatus.DISPONIBLE; 
    @InjectComponent 
    private Zone zonaDjelovanja; 
    @Inject 
    private Request request; 
    @Inject 
    private AjaxResponseRenderer ajaxResponseRenderer; 
    @Inject 
    private ComponentResources componentResources; 
    @Property 
    @Persist(PersistenceConstants.FLASH) 
    private TipDrawTiketa drawTip; 
    @Inject 
    private AlertManager manager; 
    @Component(id = "dodajTiket") 
    private Form form; 

    // Generally useful bits and pieces 
    void setupRender() { 

     datum = null; 
     updateDisplay(drawTip); 
    } 

// public TipDrawTiketa getNAVIDENA() { 
//  brojTiketa = 20; 
//  return TipDrawTiketa.NAVIDENA; 
// } 
// 
// public TipDrawTiketa getCHANCES() { 
//  brojTiketa = 10; 
//  return TipDrawTiketa.CHANCES; 
// } 
// 
// public TipDrawTiketa getLOTERIANACIONAL() { 
//  brojTiketa = 20; 
//  return TipDrawTiketa.LOT_NAC; 
// } 

    public String getFormatirajMe() { 
     String prviDio = String.format("%03d", series); 
     String drugiDio = String.format("%02d", broj); 
     return prviDio + drugiDio; 
    } 

    public Object getOsvjeziZonu() { 
     if (drawTip == drawTip.LOT_NAC) { 
      brojTiketa = 20; 
      return zonaDjelovanja.getBody(); 
     } else if (drawTip == drawTip.CHANCES) { 
      brojTiketa = 10; 
      return zonaDjelovanja.getBody(); 
     } else if (drawTip == drawTip.NAVIDENA) { 
      brojTiketa = 10; 
      return zonaDjelovanja.getBody(); 
     } else { 
      brojTiketa = 10; 
      return zonaDjelovanja.getBody(); 
     } 
    } 

    @OnEvent(value = EventConstants.VALUE_CHANGED, component = "drawTip") 
    public Object updateDisplay(TipDrawTiketa tipDrawTiketaa) { 
     drawTip = tipDrawTiketaa; 
     if (drawTip == TipDrawTiketa.LOT_NAC) { 
      brojTiketa = 20; 
      return zonaDjelovanja.getBody(); 
     } else if (drawTip == TipDrawTiketa.CHANCES) { 
      brojTiketa = 10; 
      return zonaDjelovanja.getBody(); 
     } else if (drawTip == TipDrawTiketa.NAVIDENA) { 
      brojTiketa = 20; 
      return zonaDjelovanja.getBody(); 
     } else { 
      brojTiketa = 20; 
      return zonaDjelovanja.getBody(); 
     } 
    } 


    /** 
    * 
    * @return 
    */ 

    @CommitAfter 
    @OnEvent(value = "submit", component = "dodajTiket") 
    void onDodajTiket() { 
     for (int i = 0; i < brojTiketa; i++) { 
      hibernate.save(new Tiket(StringUtils.leftPad(String.valueOf(series + "" + broj), 5, ""), datum, drawTip, String.format("%03d", series), String.format("%02d", broj), status, cijena)); 

     } 
     String redom = "Created ticket sheet serial " + series + "\n" + " number " + broj; 
     //manager.alert(Duration.UNTIL_DISMISSED, Severity.INFO, redom); 
     componentResources.discardPersistentFieldChanges(); 
    } 

    @Property 
    private JSONObject params; 

    @OnEvent(EventConstants.ACTIVATE) 
    public void onActivate() { 

     params = new JSONObject(); 

     params.accumulate("modal", true); 


    } 
} 

enter image description here이 이미지에 enter image description here

 <t:layout t:pageTitle='${message:AddTickets}' xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"> 
     <t:jquery.jgrowl /> 
     <form t:type="form" t:id="dodajTiket"> 
      <t:zone t:id="zonaDjelovanja" id="zonaDjelovanja"> 
       <t:errors/> 
       <div class="palette palette-concrete" style="height:80%;"> 

        <div class="col-xs-12" style="margin-left:17px;"> 
         <h5>${message:selectTypeOfTicket}</h5> 
         <t:select t:id="drawTip" style="color:black;" validate="required" t:event="OsvjeziZonu" zone="zonaDjelovanja" /> 
        </div> 
        <!-- fecha del sorteo --> 
        <div class="col-xs-12"> 
         <div class="col-xs-3"> 
          <t:label for="datum"><h6>${message:datum}</h6></t:label> 
          <t:datefield id="uzmiDatum" validate="required" class="form-control" t:id="datum"/> 
         </div> 

         <!-- no de fracciones --> 
         <div class="col-xs-3"> 
          <div class="post-box"><label><h6>${message:numberOfTickets}</h6></label> 
           <input class="form-control" validate="required" t:type="TextField" t:id="brojTiketa" t:value="brojTiketa"/></div> 
         </div> 
        </div> 
        <div class="col-xs-12"> 
         <div class="col-xs-3"> 
          <div class="post-box"><label><h6>${message:number}</h6></label> 
           <input class="form-control" id="uzmiBroj" validate="required" t:type="TextField" t:id="broj"/></div> 
         </div> 
         <div class="col-xs-3"> 
          <div class="post-box"><label><h6>${message:serial}</h6></label> 
           <input class="form-control" validate="required" t:type="TextField" t:id="series" t:value="series" /></div> 
         </div> 

         <div class="col-xs-3"> 
          <div class="post-box"><label><h6>${message:price}</h6></label> 
           <input class="form-control" t:type="TextField" t:id="cijena" t:value="cijena"/></div> 
         </div> 
        </div> 
        <div class="col-xs-12"> 
         <br></br> 
         <br></br> 
         <div class="col-xs-3"> 
          <!-- 
          <t:submit value="Confirmar" t:event="dodajTiket" class="form-control" t:height="300" t:message="¿Seguro que desea crear esta entrada? ${kopijaBroj}" t:mixins="confirm"/> 
          --> 
          <t:zone t:id="zonaUploadovanja" id="zonaDjelovanja"> 
           <div t:type="jquery/dialog" t:zone="zonaDjelovanja" t:clientId="modal-example" class="k-modal" t:params="params"> 
            <div class="content"> 

             <p>¿Seguro que desea crear esta entrada? 
             </p> 
             ${brojTiketa} 
             <!-- 
              <script> document.getElementById('izmiBroj').value</script>--> 
             <p style="color:red; font-size: 25px;">6</p> 
            </div> 
            <t:submit t:event="OsvjeziZonu" value="Confirmar" class="form-control" /> 
           </div> 
          </t:zone> 
         </div> 
        </div> 
       </div> 
      </t:zone> 
     </form> 

     <t:jquery.dialoglink t:dialog="modal-example" class="k-modal-trigger">Open</t:jquery.dialoglink> 
    </t:layout> 
, 나는 영역 안에 필드 Cantidad 드 Fracciones에서 매개 변수를 사용하려고 한 페이지가로드 된 경우에만 작동합니다 cantidad de fracciones의 가치도 대화 내에서 변경 될 것입니다.하지만 AJAX 덕분이 아닙니다. 나는 Cantidad de Fracciones의 가치를 페이지로드에서 가져오고이 페이지에 머물러있을 때 변경할 수 없다고 생각합니다. 내가 원하는. 필드 Cantidad de Fracciones에서 입력을 변경하면 대화 상자 안의 Cantidad de Fracciones의 가치가 업데이트되기를 바랍니다.

은 UPDATE :

는 모든 클라이언트 쪽 일이 있기 때문에, 나는 랜스 자바 대답 제안 주어진 필드의 텍스트 변화에 듣는 JQuery와 접근 방식을 사용하는 선택했습니다.

<script> 
       $("input") 
         .keyup(function() { 
        var value = $(broj).val(); 
        $("#provjeraBroj").text(value); 
        var value = $(datum).val(); 
        $("#provjeraDatum").text(value); 
        //var value = $(drawTip).val(); 

        $('#drawTip').change(function() { 
         var $selected = $(this).find('option:selected'); 
         if ($selected.val() === 'LOT_NAC') { 
          $("#provjeraDrawTip").text("Loteri"); 
         } 
         if ($selected.val() === 'CHANCES') { 
          $("#provjeraDrawTip").text("Chances"); 
         } 
         else { 
          $("#provjeraDrawTip").text("Navideña"); 

         } 
        }).change(); 


        var value = $(series).val(); 
        $("#provjeraSeries").text(value); 
        var value = $(brojTiketa).val(); 
        $("#provjeraBrojTiketa").text(value); 
       }) 
         .keyup(); 
      </script> 
+0

"업데이트"는 실제로 2 차 답이되어야합니다. –

답변

2

confirm mixin은 clientside가 호출 될 때마다 동적 메시지를 생성하지 않습니다. 메시지는 페이지가 렌더링 될 때 서버 측으로 결정됩니다 (브라우저의 HTML 소스를 확인하면 메시지가 표시됩니다).

따라서 t:message="¿Seguro que desea crear esta entrada? ${kopijaBroj}"은이 필드의 초기 값 (null 및 0)을 사용하여 렌더링합니다.

당신은 내가 두 가지 옵션을 볼 수 있습니다 현재 필드의 값에 따라 동적 메시지하려는 경우 :

  1. 를 사용하여 클라이언트 측 필드 값과 메시지에 메시지가 표시 될 때마다 토큰을 대체하는 자바 스크립트.
  2. 매번 메시지를 렌더링하기 위해 서버 측 왕복을 수행하십시오. 요청 매개 변수를 사용하여 서버 측으로 전달되는 현재 값이 필요합니다.

어느 쪽이든, 확인 mixin은 이것을 기본적으로 사용하지 않으므로 사용자 정의 믹스 인이 필요합니다. 옵션 1은 모든 클라이언트 측에서 훨씬 좋은 사용자 경험을 제공합니다.

+0

@ Lance에 대한 귀하의 코멘트에 감사드립니다. 접근 번호 1을 사용했고 이것은 Q의 업데이트 된 버전에서 볼 수 있습니다. 문제를 찾을 위치를 찾는데 도움을 주려면 받아 들일 때이 대답을 선택하십시오. –