【问题标题】:Bind value directly to JSF selectItem without p:selectManyCheckbox value将值直接绑定到没有 p:selectManyCheckbox 值的 JSF selectItem
【发布时间】:2014-12-01 04:55:40
【问题描述】:

原来是这样的。

我的手机:

@Named("MyMb")
@SessionScoped
public class MySuperCoolMb implements Serializable {
    //Tons of attributes

    private List<ListModelOne> lmo = new ArrayList();

    //Tons of methods
}

外部模型:

public class ListModelOne {

    private coolObject object;
    private List<ReadWrite> permissions;

    //init()
    //setters-getters

}

Inner Model,这是需要直接绑定到屏幕上的selectItems的Model

public class ReadWrite {

    private String accessItem;
    private boolean read = false;
    private boolean write = false;
    //Somewhere in my code i change this from true/false depending
    //what i need and they do change in title in xhtml.
    //setters-getters
}

还有我的 xhtml:

<h3>Cool Title</h3>
<p:accordionPanel value="#{MyMb.lmo}" var="modelOne">
    <p:tab title="#{modelOne.coolObject.ObjectName}">
    <h3>Cool Inner Title</h3>
        <ui:repeat value="#{modelOne.permissions}" var="readWrite">
            <h:panelGrid>
            <h:outputText value="#{readWrite.accessItem}"/>
                <!-- selectManyCheckbox has no value attribute because i don't need/have a list/collection to bind it -->
                <p:selectManyCheckbox>
                    <f:selectItem itemLabel="Read" itemValue="#{readWrite.read}" title="This is set to #{readWrite.read}"/>
                    <f:selectItem itemLabel="Write" itemValue="#{readWrite.write}" title="This is set to #{readWrite.write}"/>
                </p:selectManyCheckbox>
            </h:panelGrid>
        </ui:repeat>
    </p:tab>
</p:accordionPanel>

一切正常,但复选框(selectItem)可以直接绑定到类的属性并忽略 p:selectManyCheckboxes 的值吗? 在 java 上一切正常,我已经调试过并且值是正确的,他们甚至在 f:selectItem 中的“tittle”属性上打印 OK(有些是真的,有些是假的)

PS:我也无法理解 ItemLabel、label、ItemValue、Value 之间的区别

【问题讨论】:

    标签: jsf jsf-2 primefaces nested


    【解决方案1】:

    itemlabel 和 ItemValue 的区别在于 itemlabel 是显示的标签,ItemValue 是给选择的值

    【讨论】:

      【解决方案2】:

      是否反对使用两个&lt;p:selectBooleanCheckbox&gt;

      否则我会提出这样的代码:

      <h:panelGrid>
          <h:outputText value="#{readWrite.accessItem}"/>
          <p:selectBooleanCheckbox value="Read" itemLabel="#{readWrite.read}" />
          <p:selectBooleanCheckbox value="Write" itemLabel="#{readWrite.write}" />
      </h:panelGrid>
      

      看看这个:http://www.primefaces.org/showcase/ui/input/booleanCheckbox.xhtml

      如果您想动态生成您的 selectOptions(如下拉菜单中的复选框或选项等),则使用 ItemValue 和 ItemLabel。 示例:

      // Java-class...
      @Named(
      public enum SelectOption(){
          Max, Oliver, John;
      }
      
      // In bean...
      private List<SelectOption> fornames; // with setter & getter
      
      // In xhtml...
      <p:selectManyCheckbox value="#{bean.fornames}">
          <f:selectItems value="#{bean.fornames.values()}" var="forname" 
              itemValue="#{forname}" itemLabel="#{forname.toString()}" />
      </p:selectManyCheckbox>
      

      说明:您的 bean 中的 List 将获取所有选定的项目。 f:selectItems-tag 从枚举中获取所有可能的选项(您可以移交任何集合),并迭代集合中的每个“forname”对象。在这种情况下,itemValue 表示它自己,因为我们有一个要保存它的对象的列表,对于标签,我们调用 toString 方法。

      我希望这个解释可以理解。

      【讨论】:

      • 是的,这就是答案,我昨天做了这个,但它仍然无法正常工作,不知何故,当我打开 p:tab 时,primefaces 只进入复选框的设置器并将它们设置为 false。 (不是我的类 ReadWrite 上 String accessItem 的设置器)但这是另一个问题,也许我会打开另一个问题。
      • 嗯...我从上面的代码中删除了它,但我在 acordeonPanel 上有 Dynamic=true,所以延迟加载做了一些奇怪的事情。仍然是 tyvm 让您花时间。干杯
      • 延迟加载功能在理论上很好,但不适用于太多的事件、ajax 等...我不明白你想用 accessItem 的设置器做什么。在您的代码中,该属性是只读的(通过输出文本)。请告诉我,如果您还有其他问题。干杯
      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2012-12-01
      相关资源
      最近更新 更多