使用不带autoCompletion的标签输入多个

时间:2016-09-22 09:34:22

标签: jsf input primefaces autocomplete tags

我有两个输入。

我希望这两个输入具有相同的外观和感觉,如下所示:

enter image description here

第一个输入使用自动完成功能,并允许用户选择术语列表=>我使用 p:autocomplete (参见Primefaces documentation on autocomplete) 此输入正常。

对于第二个输入,我希望具有相同的显示但没有任何自动完成:用户只需输入一个没有自动完成的术语列表。 我尝试使用假的自动完成功能返回用户给出的值,但是它太慢并且当用户退出输入时行为不正确。

欢迎任何想法。

2 个答案:

答案 0 :(得分:3)

在快速查看PrimeFaces javascript code of the autoComplete并花了几个小时进行实验后,我想出了一个解决方案。它涉及覆盖bindKeyEvents并在其中决定是否调用原始键,添加空格键检测(选择标记'),按下时,添加标记并激活selectionEvent(如果ajax是用过的)。将以下代码放在您的页面或外部javascript文件中

   <script>
   //<![CDATA[

            if(PrimeFaces.widget.AutoComplete) {

                PrimeFaces.widget.AutoComplete = PrimeFaces.widget.AutoComplete.extend ( {

                    bindKeyEvents: function() {
                        if (this.input.attr('data-justTags')) { 

                            var $this = this;

                            this.input.on('keyup.autoComplete', function(e) {
                                var keyCode = $.ui.keyCode,
                                key = e.which;

                            }).on('keydown.autoComplete', function(e) {
                                var keyCode = $.ui.keyCode;

                                $this.suppressInput = false;
                                switch(e.which) {

                                    case keyCode.BACKSPACE:
                                        if ($this.cfg.multiple && !$this.input.val().length) {
                                            $this.removeItem(e, $(this).parent().prev());

                                            e.preventDefault();
                                        }
                                    break;

                                    case keyCode.SPACE:

                                        if($this.cfg.multiple) {
                                            var itemValue = $this.input.val();

                                            var itemDisplayMarkup = '<li data-token-value="' +itemValue + '"class="ui-autocomplete-token ui-state-active ui-corner-all ui-helper-hidden">';
                                            itemDisplayMarkup += '<span class="ui-autocomplete-token-icon ui-icon ui-icon-close" />';
                                            itemDisplayMarkup += '<span class="ui-autocomplete-token-label">' + itemValue + '</span></li>';

                                            $this.inputContainer.before(itemDisplayMarkup);
                                            $this.multiItemContainer.children('.ui-helper-hidden').fadeIn();
                                            $this.input.val('').focus();

                                            $this.hinput.append('<option value="' + itemValue + '" selected="selected"></option>');
                                            if($this.multiItemContainer.children('li.ui-autocomplete-token').length >= $this.cfg.selectLimit) {
                                                $this.input.css('display', 'none').blur();
                                                $this.disableDropdown();
                                            }

                                            $this.invokeItemSelectBehavior(e, itemValue);    
                                         }


                                    break;
                                };

                            });
                     } else {
                         //console.log("Original bindEvents");
                         this._super();
                     }
                }
            });
        }


   //]]>

    </script>

为了决定何时调用原始属性,我决定使用名称为data-justTags的passThrough属性。例如pt:data-justTags="true"(值无关紧要,因此pt:data-justTags="false"pt:data-justTags="true"相同。一个小的html片段是:

<p:autoComplete pt:data-justTags="true" multiple="true" value="#{myBean.selectedValues}">

不要忘记添加xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"命名空间声明。

答案 1 :(得分:1)

我找到了一个可以完成工作的组件:http://www.butterfaces.org/tags.jsf