1

一部のフィールドが読み取り専用として定義されているJSF2フォームがありますが、ユーザーはアクセスできませんが、送信する必要があります。私が直面している問題は、フォームを送信すると、読み取り専用フィールドがnullと評価されることです。スレッドを読みました<h:inputText readonly = "true">のデータは、いくつかの提案でコマンドボタンをクリックすると消えますが、それらがどのように機能するか理解できなかったか、フォームに問題があります。

これが私のフォームにあるものです:

<h:inputTextarea  id="attLFld" value="#{cc.attrs.inc.attL}" rows="8" cols="40" 
         onblur="lookupL(this.value)" >
    <rich:validator/>
</h:inputTextarea>

<h:inputText  id="attLIFld" value="#{cc.attrs.inc.attLI}"   size="14"  readonly="true" />

<a4j:jsFunction name="lookupL" execute="attLFld"
        render="attLFld,attLIFld" 
        action="#{incController.lookupL}">        
</a4j:jsFunction>

そして、これが私のコントローラーメソッドです

public void lookupL()
{
   newInc.setAttLI("1234");
}

上記のスレッドで提案されているように、タグreadonlyが設定されたinputTextフィールドを作成しようとしました

<h:inputText  id="attLIFld" value="#{cc.attrs.inc.attLI}"   size="14"  readonly="#{facesContext.renderResponse}" />

しかし、それは私にはうまくいきませんでした。


残念ながら、その提案は私にはうまくいきませんでした。フォームに何か問題があると思いますが、何がわかりません。どんな助けでも大歓迎です。

これがxhtmlの抜粋です(私はRichfaces 4を使用しています)

<composite:implementation>
<h:panelGrid columns="3"   border="0">
<h:panelGrid columns="1" border="0">   
    <rich:panel id="rpA"> 
        <f:facet name="header">
            <h:outputText value="Field Group A"/>
        </f:facet>  
        <h:panelGrid columns="2" columnClasses="titleCell"   border="0">    
            <h:outputLabel for="fldA1" value="Field A1:" />
            <h:inputTextarea  id="fldA1" value="#{cc.attrs.mybean.fldA1}" rows="8" cols="40" immedite="true" onblur="lookup(this.value)" >
                <rich:validator/>
            </h:inputTextarea>              

            <h:outputLabel for="fldA2" value="Field A2:" />
            <h:inputText  id="fldA2" value="#{cc.attrs.mybean.fldA2}"   size="14"  readonly="true" />                       

            <h:outputLabel for="fldA3" value="Field A3:"/>
            <h:inputText  id="fldA3" value="#{cc.attrs.mybean.fldA3}"  readonly="#{facesContext.renderResponse}" size="14"/>            

        </h:panelGrid>           
    </rich:panel>    
</h:panelGrid>
<h:panelGrid id="pgButtons" columns="1" border="0">
    <a4j:commandButton type="button"  value=">>>>"  action="#{myBeanController.copyFields}"  immediate="true"
    execute="fldA1,fldA2,fldA2H,fldA3,fldA3H" 
    render="fldB1,fldB2,fldB3"/> 

 </h:panelGrid>

<rich:panel id="rpB"> 
        <f:facet name="header">
            <h:outputText value="Field Group B"/>
        </f:facet>  
        <h:panelGrid columns="2" columnClasses="titleCell"   border="0">    
            <h:outputLabel for="fldB1" value="Field B1:" />
            <h:inputTextarea  id="fldB1" value="#{cc.attrs.mybean.fldB1}" rows="8" cols="40" immediateue="true"  >
                <rich:validator/>
            </h:inputTextarea>              

            <h:outputLabel for="fldB2" value="Field B2:" />
            <h:inputText  id="fldB2" value="#{cc.attrs.mybean.fldB2}"   size="14"  readonly="true" />      


            <h:outputLabel for="fldB3" value="Field B3:"/>
            <h:inputText  id="fldB3" value="#{cc.attrs.mybean.fldB3}"  readonly="#{facesContext.renderResponse}" size="14"/>


        </h:panelGrid>           
    </rich:panel>    
</h:panelGrid>      

<div id="hiddenFields">

     <h:inputHidden value="#{cc.attrs.mybean.fldA2H}" id="fldA2H" />
     <h:inputHidden value="#{cc.attrs.mybean.fldA3H}" id="fldA3H"/>  
</div>

<a4j:jsFunction name="lookup" execute="fldA1"
    render="fldA1,fldA2,fldA3,,fldA2H,fldA3H" 
    action="#{myBeanController.lookup}">
  <a4j:param name="loc" assignTo="#{cc.attrs.mybean.fldA1}" />
</a4j:jsFunction>

</composite:implementation>

ここで私がやろうとしているのは、フィールドA1に何かを入力してから、A2フィールドとA3フィールドにデータを入力し、ボタンをクリックしてそれらすべてのAxフィールドをBxフィールドにコピーすることです。最初の部分は実行できますが、ボタンをクリックすると、表示(ただし読み取り専用)フィールドと非表示フィールドの両方がコントローラーメソッドcopyFieldsでnullと評価されます。

@Model
public class MyBeanController {
  private MyBean newMBean;
   private MyBean mBean;

   @Produces
   @Named
   public MyBean getNewMBean()  {
      return newMBean;
   }

    @Produces
    @Named
    public MyBean getMBean() {
        return mBean;
    }

    public void setNewMBean(MyBean mBean) {
        this.mBean = mBean;
    }

    @PostConstruct
    public void initNewMBean() {
        newMBean = new MyBean();        
    }

    public void lookup()    {
        newMBean.setFldA2("boo");
        newMBean.setFldA2H("boo");
        newMBean.setFldA3("hoo");
        newMBean.setFldA3H("hoo");
    }

    public String copyFields()  {
        newMBean.setFldB1(newMBean.getFldA1());
        newMBean.setFldB2(newMBean.getFldA2H());
        newMBean.setFldB3(newMBean.getFldA3H());
        return null;

    }
4

2 に答える 2

0

次のようにコンポーネントを無効にしてみてください。

<h:inputText  id="fldA3" value="#{cc.attrs.mybean.fldA3}"  disabled="#{facesContext.renderResponse}" size="14"/>
于 2014-08-29T08:19:45.027 に答える
0

私はこの問題に何度か直面しました。JSF は、無効化された入力フィールドや読み取り専用の入力フィールドを送信しません。これは、既に開発されたインターフェイスをすばやく簡単に変更する必要がある場合に苦労する可能性があります。この読み取り専用フィールドも検証されません。非表示の入力フィールドを既存のフィールドと並行して追加すると、使用が不便になる他の問題があるため、入力を通常のデフォルト状態のままにし、より高い z-index を持つ追加の要素でそれらをカバーすることにしました。これにより、フィールドはアクティブになり、によって処理されます通常は JSF ですが、ユーザーには読み取り専用フィールドとして表示されます。入力の上に「position: absolute」を含む div を配置するだけで、適用された CSS に応じて読み取り専用または無効のように動作します。

このような div の CSS の例:

div.input-blocker {
position: absolute;
left: 0;
top: 0;
z-index: 10004;
width: 100%;
height: 80px;
background-color: rgba(0,0,0,0.05);

}

于 2015-09-22T06:51:27.917 に答える