【问题标题】:Set input fields to editable within composite component在复合组件中将输入字段设置为可编辑
【发布时间】:2013-02-27 22:36:58
【问题描述】:

我有一个复合组件

       <co:interface>
            <co:attribute name="editAction"     required="false"  targets="edit"   method-signature="java.lang.String f()"/>
            <co:attribute name="saveAction"     required="false"  targets="save"   method-signature="java.lang.String f()"/>
            <co:attribute name="isBrowseModus"  required="true"/>
            <co:attribute name="user"           required="true"/>
            <co:attribute name="editListener"   targets="edit" method-signature="void f(javax.faces.event.ActionEvent)" />
            <co:actionSource name="save"/>
        </co:interface>
        <co:implementation>
............
        <p:inplace id="inpLand" editor="true" 
            toggleable="#{not cc.attrs.isBrowseModus}" 
            style="#{cc.attrs.isBrowseModus ? 'color: black' : 'color: blue'}">  
                <p:inputText value="#{cc.attrs.user.land}" label="text"/>  
        </p:inplace>  
...........
        <c:if test="#{cc.attrs.isBrowseModus}">
           <p:commandButton id="edit" value="#{msgs.co_userdata_button_edit}" icon="ui-icon-unlocked" actionListener="#{cc.attrs.editListener}"/>
        </c:if>

其实这个复合组件是由调用myData.xhtml的视图调用的:

    <h:form id="dataForm">  
        <mc:UserData user="#{dataBean.user}" 
               isBrowseModus="#{dataBean.browseModus}"
               saveAction="#{dataBean.save}" 
               editListener="#{dataBean.editActionListener}">
        </mc:UserData>   
    </h:form>  

我的目标是什么:在该复合组件中,用户可以通过单击“编辑”按钮来更改任何用户数据。我更喜欢使用 PRIMEFACES 的就地标签。单击编辑按钮后,所有可更改的字段应显示为蓝色(请参阅复合组件)。

我的问题是我不知道如何将 isBrowseModus 标志(定义为 cc-attribute)更新为 false。实际上我是在 editActionListener (在 managedBean 中定义)中完成的,但不幸的是没有任何结果。

从托管 bean 中提取(dataBean):

....
    public boolean isBrowseModus() {
        return browseModus;
    }

    public void setBrowseModus(boolean browseModus) {
        this.browseModus = browseModus;
    }


    public void editActionListener(ActionEvent event) {
        browseModus = false;
        FacesContext.getCurrentInstance().renderResponse();
    }
....

我对 JSF 不太熟悉,因为我从一个月以来就一直在使用 JSF。也许有更方便的方法来实现这个结果。 但不幸的是我不知道怎么做。 有没有人可以帮我解决这个问题?

提前非常感谢。 问候, 博多

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    布尔变量正在通过数据传递,cc.attrs.isBrowseModus 与您的 databean 中的 browseModus 无关。理想的解决方案是保留 Boolean 对象以便传递引用,但由于 Java 中的 Boolean 包装器也是不可变的,因此您需要使用具有布尔值的东西,例如 commons-lang 中的 MutableBoolean 类。

    <h:form id="dataForm">  
            <mc:UserData user="#{dataBean.user}" 
                   isBrowseModus="#{dataBean.browseModus}"
                   saveAction="#{dataBean.save}" 
                   editListener="#{dataBean.editActionListener}">
            </mc:UserData>   
        </h:form>
    
    ...
     <p:inplace id="inpLand" editor="true" 
                toggleable="#{not cc.attrs.isBrowseModus.value}" 
                style="#{cc.attrs.isBrowseModus ? 'color: black' : 'color: blue'}">  
                    <p:inputText value="#{cc.attrs.user.land}" label="text"/>  
            </p:inplace>  
    ...
    
    
    
    ....
    MutableBoolean browseModus = new MutableBoolean();
    
        public MutableBoolean isBrowseModus() {
            return browseModus;
        }
    
        public void setBrowseModus(MutableBoolean browseModus) {
            this.browseModus = browseModus;
        }
    
    
        public void editActionListener(ActionEvent event) {
            browseModus.setValue(true);
            FacesContext.getCurrentInstance().renderResponse();
        }
    ....
    

    【讨论】:

    • 它应该有,因为现在一切都是通过引用传递的。它可能与primedaces有关。您可以尝试在 h:outputtext 中打印值
    猜你喜欢
    • 2023-01-17
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多