【问题标题】:Building a client side transfer method for p:pickList为 p:pickList 构建客户端传输方法
【发布时间】:2014-03-21 13:04:36
【问题描述】:

我正在使用 Mojarra JSF 2.1.28 和 Primefaces 3.5。我想为p:pickList 组件实现客户端传输输入,用户在其中键入内容并通过可用元素列表中的标签搜索值,然后将其传输到目标列表。这就是我的代码的样子:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
    <script>
        //Just for testing, transfer the second element 
        //to the target list when document is ready. Works well
        $(document).ready(function(string) {
            transfer("name2");
        });
        //Transfer function. It takes each list item from the source list and checks if it matches with the given pattern
        //If it does, moves it to the target list
        function transfer(string) {
            $(".ui-picklist-source li").each(function() {
                var re = new RegExp(string);
                if ($(this).attr('data-item-label').match(re)) {
                    $(".ui-picklist-target").append($(this));
                }
            });
        };
    </script>
    <h:form>
        <p:inputText
            onkeypress="if (event.keyCode == 13) { transfer(this.value); return false;}" />
    </h:form>
    <h:form id="form">
        <p:pickList value="#{bean.elements}" var="element"
            itemLabel="#{element.name}" itemValue="#{element.name}" id="picklist" />
        <p:commandButton value="Send" action="#{bean.send}" />
    </h:form>
</h:body>
</html>
@ManagedBean
@ViewScoped
public class Bean implements Serializable{

    public class Element {

        private String name;

        public Element(String n) {
            name = n;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return "Element [name=" + name + "]";
        }

    }

    private DualListModel<Element> elements;

    public Bean() {
        List<Element> source = new ArrayList<Bean.Element>();
        List<Element> target = new ArrayList<Bean.Element>();
        source.add(new Element("name1"));
        source.add(new Element("name2"));
        elements = new DualListModel<Bean.Element>(source, target);
    }

    public DualListModel<Element> getElements() {
        return elements;
    }

    public void send() {
        System.out.println("Available: " + elements.getSource() + " assigned: "
                + elements.getTarget());
    }

    public void setElements(DualListModel<Element> elements) {
        this.elements = elements;
    }

}

好吧,在这个测试用例中,有两个项目可供使用,name1name2。当页面加载时,我使用$(document).ready() 调用我的transfer(string) 函数,以便将name2 移动到目标列表。页面被正确加载,如果我们点击Send 按钮,我们会正确分配第二个元素。

使用p:inputText 组件调用函数时出现问题。在这里,我们监听 Enter 键事件以发送当前给定值并执行传输。在客户端它工作得足够公平,它的行为符合预期。但是,当点击Send 时,模型不会在服务器端正确更新。

我推断这是由JSF保存的视图状态引起的,但是如何处理呢?有没有办法实现它还是我必须坚持 Ajax 请求?

【问题讨论】:

    标签: javascript jquery jsf jsf-2 primefaces


    【解决方案1】:

    实现这一点的“正确”方法是使用 Primefaces 的 Javascript API

    PrimeFaces.widget.PickList

    假设你的widgetVarpickListWV,你会这样做:

    function transfer(string) {
            PF('pickListWV').sourceList.children().each(function() {
                var re = new RegExp(string, "i");
                if ($(this).attr('data-item-label').match(re)) {
                    PF('pickListWV').selectItem($(this));// select the item
                    PF('pickListWV').add();// add it to the target
                }
            });
        }
    

    编辑: 你也可以让它更有趣,比如实时过滤..

     <p:inputText
            onkeypress="if (event.keyCode == 13) { transfer(this.value); return false;} else{PF('pickListWV').filter(this.value, PF('pickListWV').sourceList)}" />
    

    编辑 2:

    我可以看到你有一个区分大小写的匹配,所以你必须将你的 RegExp 声明为不区分大小写

    var re = new RegExp(string, "i");
    

    这是github 上的一个小型工作示例,以及一个根据要求工作的demo :)

    希望这会有所帮助。

    【讨论】:

    • 嗨 Hatem,感谢您的回复。选择列表的客户端 API 在 3.5.0 中可用吗?没有在文档中看到它:-(
    • javascript api 不在文档中,甚至在 4.0 中也没有。您可以在控制台中调试并查看 JS 代码并尝试了解它的作用。老实说,我已经测试过了你用 4.0 的情况,它工作得很好。我认为在 3.5 中它也可以工作
    • 使用 Mojarra 2.2.6 和 PF 4.0 测试,但无法正常工作。您能否发布适合您的整个测试用例?
    • 看起来不错,我的朋友 ;-) 如果开始使用 3.5,会将其标记为已回答
    • 它有效 ;-) 就我个人而言,我不喜欢像在演示中那样在关键事件发生时过滤源列表的想法。但是,省略 else 部分,在 3.5 中也可以。恭喜!
    猜你喜欢
    • 2017-07-05
    • 2016-09-28
    • 2014-10-24
    • 2017-03-06
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多