2012-08-23 63 views
3

我創建了一個複合組件,它實現了一個微調,我工作得很好,但是當我從primefaces 2.2.1更改爲primefaces 3.3.1時,組件崩潰了所有的頁面,當我嘗試使用p :ajax而不是f:ajax。p:ajax正在崩潰複合組件

這裏是組分:

<c:interface> 
    <c:attribute name="value" required="true"/> 
    <c:attribute name="fator" required="false" default="1"/> 
    <c:attribute name="required" required="false" default="false"/> 
    <c:attribute name="requiredMessage" required="false" default=""/> 
    <c:attribute name="validatorMessage" required="false" default="Não é um número válido!"/> 
    <c:attribute name="disabled" required="false" default="false"/> 
    <c:attribute name="title" required="false" default=""/> 
    <c:attribute name="width" required="false" default="100"/> 
    <c:attribute name="dinheiro" required="false" default="false"/> 
    <c:attribute name="local" required="false" default="pt-BR"/> 
    <c:attribute name="imediato" required="false" default="false"/> 
    <c:attribute name="onchange" required="false" default=""/> 
    <c:attribute name="onkeyup" required="false" default=""/> 
    <c:attribute name="max" required="false" default="-1"/> 
    <c:attribute name="min" required="false" default="0"/> 
    <c:attribute name="parametro" required="false" default=""/> 
    <c:attribute name="casasDecimais" required="false" default="2"/> 
    <c:attribute name="valueChangeListener" method-signature="void method(javax.faces.event.ValueChangeEvent)" 
       targets="spinner"/> 
    <c:attribute name="rendered" required="false" default="true"/> 
    <c:editableValueHolder name="#{cc.id}" targets="spinner"/> 
    <c:clientBehavior name="blur" default="true" event="blur" 
         targets="spinner"/> 
    <c:clientBehavior name="change" default="true" event="change" 
         targets="spinner"/> 
</c:interface> 

<c:implementation> 
    <h:outputStylesheet library="css" name="hrgiSpinner.css" target="head"/> 
    <h:outputScript library="js" name="jquery.formatCurrency-1.4.0.min.js" target="head"/> 
    <h:outputScript library="js" name="jquery.formatCurrency.pt-BR.js" target="head"/> 
    <h:outputScript library="js" name="hrgiSpinner.js" target="head"/> 
    <h:panelGroup layout="block" styleClass="hrgi-spinner" rendered="#{cc.attrs.rendered}"> 
     <p:inputText id="spinner" value="#{cc.attrs.value}" 
        styleClass="hrgi-spinner-input editableField" disabled="#{cc.attrs.disabled}" 
        onchange="formatar(this,'#{cc.attrs.fator}','#{cc.attrs.local}','#{cc.attrs.dinheiro}','#{cc.attrs.max}','#{cc.attrs.min}','#{cc.attrs.casasDecimais}'); #{cc.attrs.onchange}" 
        required="#{cc.attrs.required}" requiredMessage="#{cc.attrs.requiredMessage}" 
        validatorMessage="#{cc.attrs.validatorMessage}" onkeyup="#{cc.attrs.onkeyup}" 
        title="#{cc.attrs.title}" immediate="#{cc.attrs.imediato}" style="width: #{cc.attrs.width}px;" 
        converterMessage="O valor informado não é um número."> 
      <f:attribute name="objeto" value="#{cc.attrs.parametro}"/> 
     </p:inputText> 
     <h:panelGroup layout="block" styleClass="hrgi-spinner-painel-botoes" 
         rendered="#{not cc.attrs.disabled}"> 
      <div onmousedown="incrementar('#{cc.clientId}'+':spinner','#{cc.attrs.fator}','#{cc.attrs.local}','#{cc.attrs.dinheiro}','#{cc.attrs.max}','#{cc.attrs.min}','#{cc.attrs.casasDecimais}');" 
       class="hrgi-spinner-botao hrgi-spinner-botao-alto clearfix"/> 
      <div onmousedown="decrementar('#{cc.clientId}'+':spinner','#{cc.attrs.fator}','#{cc.attrs.local}','#{cc.attrs.dinheiro}','#{cc.attrs.max}','#{cc.attrs.min}','#{cc.attrs.casasDecimais}');" 
       class="hrgi-spinner-botao hrgi-spinner-botao-baixo clearfix"/> 
     </h:panelGroup> 
     <h:panelGroup layout="block" 
         styleClass="hrgi-spinner-painel-botoes hrgi-spinner-painel-botoes-desabilitados" 
         rendered="#{cc.attrs.disabled}"> 
      <div class="hrgi-spinner-botao hrgi-spinner-botao-alto clearfix"/> 
      <div class="hrgi-spinner-botao hrgi-spinner-botao-baixo clearfix"/> 
     </h:panelGroup> 
    </h:panelGroup> 
</c:implementation> 

當我使用f:AJAX:

<hrgi:spinner id="aliquotaIpiItem" rendered="#{itemEmbrulhado.carregado}" 
    disabled="#{not modeloPopupLancamentoNF.lancamentoDanfe}" 
    value="#{controladorTabelaDinamicaItemNF.recuperarIPI(itemEmbrulhado).aliquota}" 
    dinheiro="false" fator="0.01" local="pt-BR" min="0.00" width="70" 
    parametro="#{itemEmbrulhado}"> 
    <f:ajax render=":lancamentoNF:abasNF:painelItensNF :alerta" execute="@form" 
     event="blur" listener="#{controladorPopupLancamentoNF.validarAliquotasItemEAdicionar}" 
     onevent="definirFoco"/> 
    <f:convertNumber maxFractionDigits="2" minFractionDigits="2" locale="#{cc.attrs.local}" 
     for="aliquotaIpiItem"/> 
</hrgi:spinner> 

Normal

當我使用號碼:AJAX:

<hrgi:spinner id="aliquotaIpiItem" rendered="#{itemEmbrulhado.carregado}" 
    disabled="#{not modeloPopupLancamentoNF.lancamentoDanfe}" 
    value="#{controladorTabelaDinamicaItemNF.recuperarIPI(itemEmbrulhado).aliquota}" 
    dinheiro="false" fator="0.01" local="pt-BR" min="0.00" width="70" 
    parametro="#{itemEmbrulhado}"> 
    <p:ajax update=":lancamentoNF:abasNF:painelItensNF :alerta" process="@form" 
     event="blur" listener="#{controladorPopupLancamentoNF.validarAliquotasItemEAdicionar(itemEmbrulhado)}" 
     onsuccess="salvarFoco();" oncomplete="carregarFoco(); exibirPopupAlerta(xhr, status, args);"/> 
    <f:convertNumber maxFractionDigits="2" minFractionDigits="2" locale="#{cc.attrs.local}" 
     for="aliquotaIpiItem"/> 
</hrgi:spinner> 

Crashed

有人能解釋我發生了什麼?

回答

1

由於@maple_shaft說,我無法將p:ajax傳遞給複合組件。 Primefaces有一個微調組件,但不幸的是它仍然不好(不支持國際化並顯示額外的十進制數字,例如0.06666666669而不是0.07),我沒有足夠的時間等待更正。我需要使用p:ajax來處理這個組件,通常只是爲了得到像validationFailed這樣的參數。所以,我已經解決了這個問題,使用醜陋的解決方法:

<hrgi:spinner id="aliquotaIpiItem" rendered="#{itemEmbrulhado.carregado}" 
    disabled="#{not modeloPopupLancamentoNF.lancamentoDanfe}" 
    value="#{controladorTabelaDinamicaItemNF.recuperarIPI(itemEmbrulhado).aliquota}" 
    dinheiro="false" fator="0.01" local="pt-BR" min="0.00" width="70" 
    onblur="adicionarItemNF();"> 
    <f:convertNumber maxFractionDigits="2" minFractionDigits="2" locale="#{cc.attrs.local}" 
     for="aliquotaIpiItem"/> 
</hrgi:spinner> 
<p:remoteCommand name="adicionarItemNF" update=":lancamentoNF:abasNF:painelItensNF :alerta" process="@form" 
    action="#{controladorPopupLancamentoNF.validarAliquotasItemEAdicionar(itemEmbrulhado)}" global="false" 
    onsuccess="salvarFoco();" oncomplete="carregarFoco(); exibirPopupAlerta(xhr, status, args);"/> 
2

PrimeFaces ajax組件只能與其他Primefaces組件一起使用。我不相信你可以將它作爲這樣一個複合組件的clientBehavior插入,並期望它能夠工作。你將不得不使用f:ajax

從一個側面說明,從PrimeFaces 3.0開始,已經引入了p:spinner組件,因此您的複合組件雖然是一個令人印象深刻的努力,但實際上已不再需要。 :)

+0

我試過使用primefaces微調,但不能更改小數分隔符。到, – brevleq

+0

@brevleq真的嗎?這很奇怪,因爲它似乎是國際化的必要特徵。也許在PrimeFaces論壇發佈功能請求,看看是否有人已經請求了此功能。 –

+0

我會再次在primefaces論壇上提問... – brevleq