【问题标题】:Change the properties of an Input within a ui:repeat在 ui:repeat 中更改 Input 的属性
【发布时间】:2010-12-06 14:11:07
【问题描述】:

我想更改位于 ui:repeat 中的 InputText 的“必需”属性,但我无法从 ManagedBean 访问组件:

<h:selectManyCheckbox id="required" value="#{test.required}"
    layout="lineDirection" converter="javax.faces.Integer">
    <f:ajax event="change" listener="#{test.update}" />
    <f:selectItems value="#{test.selectable}"></f:selectItems>
</h:selectManyCheckbox>
<ui:repeat value="#{test.names}" var="name" id="repeat">
    <h:panelGrid columns="3">
        <h:outputLabel id="nameLabel">name:</h:outputLabel>
        <h:inputText id="name" value="#{name}"
            validator="#{test.validateName}" />
        <h:message for="name"></h:message>
    </h:panelGrid>
</ui:repeat>

我正在尝试使用 findComponent 方法,但它不起作用:

public void update(AjaxBehaviorEvent event) {
    for(Integer i: selectable) {
        UIViewRoot vr = FacesContext.getCurrentInstance().getViewRoot();
        HtmlInputText input = (HtmlInputText)vr.findComponent("form:repeat:"+i+":name");
        input.setRequired(required.contains(i));
    }
}

【问题讨论】:

    标签: jsf facelets repeat


    【解决方案1】:

    ui:repeat 不会重复视图根中的组件,它会在呈现的 HTML 输出中重复组件的输出。

    有几种方法可以正确地实现这一点。其中之一是改用值对象并在那里设置需求。例如。 List&lt;Item&gt; 其中Item 具有String nameboolean required 属性。

    <ui:repeat value="#{test.items}" var="item" id="repeat">
        <h:panelGrid columns="3">
             <h:outputLabel id="nameLabel">name:</h:outputLabel>
             <h:inputText id="name" value="#{item.name}" required="#{item.required}" validator="#{test.validateName}" />
             <h:message for="name"></h:message>
        </h:panelGrid>
    </ui:repeat>
    

    还有很多方法,但是由于你使用的JSF版本和功能需求不清楚,只能猜测哪种方式最适合你的情况。

    【讨论】:

    • 功能要求是当你点击一个checkbox选中一个item时,必须要对应的inputText。
    • 考虑可本地化的数据,复选框将是语言环境,而 inputTexts 是每个语言环境的本地化数据。只有所选语言环境的 inputTexts 是必需的。例如,如果您想为给定书籍添加翻译的标题,但只需将已翻译的语言添加到其中。
    • 要求是合理的。您愿意在h:panelGrid 的第一列用h:selectBooleanCheckbox 替换h:selectManyCheckbox 吗?将复选框和 inputtext 放在同一个重复中会更容易。
    • 代码只是一个用例,实际形式要复杂得多,甚至还有 jquery 功能来显示/隐藏必填字段。
    • 所以问题是,是否有任何方法可以从 ManagedBean 或其他组件(如验证器)中的 Java 代码访问 UIRepeat 中的 HTMLInputText 实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2021-06-07
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多