2015-04-01 2 views
1

Существует <p:selectOneListbox> с примерно 20 наименованиями. Первые 5 элементов можно просмотреть в списке, а остальные можно прокрутить и выбрать. Список ajaxified. Когда выбирается номер элемента больше 5 (после прокрутки к нему) полоса прокрутки не остается на своем месте; он перемещается в верхнее положение. Это делает невидимым выбранный элемент (например, элемент 9). В программе используется прослушиватель ajax. Приложение использует PrimeFaces 5.0.p: selectOneListbox ajax item selection change scroll position

Но, когда прослушиватель ajax удален, выбранный (элемент 9) виден и скроллер не перемещается в начало (удалите атрибут прослушивателя тега p: ajax на странице ниже JSF).

Я хотел бы знать, как сделать прокрутку не двигаться, когда какой-либо элемент выбран при использовании слушателя ajax.

страница JSF:

<p:selectOneListbox id="list" 
        scrollHeight="100" 
        value="#{bean.todo}"> 

    <f:selectItems value="#{bean.data}" 
        var="t" 
        itemLabel="#{t.name}" 
        itemValue="#{t.name}"/> 

    <p:ajax process="@this" 
      update="@this msg" 
      listener="#{bean.valueChanged}" /> 
</p:selectOneListbox> 

<br /><h:outputText id="msg" value="#{bean.message}" /> 

код бина:

import javax.faces.bean.*; 
import java.io.Serializable; 
import java.util.*; 
import javax.faces.event.AjaxBehaviorEvent; 
import javax.faces.component.UIOutput; 

@ManagedBean(name="bean") 
@SessionScoped 
public class TodosBean implements Serializable { 

    private List<Todo> data; 
    private String todo; // selected item value 
    private String msg; 

    public TodosBean() { 
     loadData(); 
     if (data.size() == 0) { 
      return; 
     } 

     Todo t = data.get(0); 
     String name = t.getName(); 
     setTodo(name); // select the first item in the list 
     setMessage(name); 
    } 

    private void loadData() { 
     data = new ArrayList<>(); 
     data.add(new Todo("1first", "1")); 
     data.add(new Todo("2second", "2")); 
     data.add(new Todo("3third", "3")); 
     data.add(new Todo("4fourth", "4")); 
     data.add(new Todo("5fifth", "5")); 
     data.add(new Todo("6sixth", "6")); 
     data.add(new Todo("7seventh", "7")); 
     data.add(new Todo("8eighth", "8")); 
    } 

    public List<Todo> getData() { 
     return data; 
    } 

    public void setMessage(String msg) { 
     this.msg = msg; 
    } 

    public String getMessage() { 
     return msg; 
    } 

    public String getTodo() { 
     return todo; 
    } 

    public void setTodo(String t) { 
     todo = t; 
    } 

    public void valueChanged(AjaxBehaviorEvent e) { 
     String name = (String) ((UIOutput) e.getSource()).getValue(); 
     setMessage(name + " selected."); 
    } 
} 
public class Todo { 

    private String name; 
    private String desc; 

    public Todo() {} 

    public Todo(String name, String desc) { 
     this.name = name; 
     this.desc = desc; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDesc() { 
     return desc; 
    } 

    public void setDesc(String desc) { 
     this.desc = desc; 
    } 

    @Override 
    public String toString() { 
     return this.name; 
    } 
} 
+0

Не обновлять '@this'? Или попробуйте новую версию PF – Kukeltje

+0

@Kukeltje: Удаление «@this» в p: обновление ajax разрешило проблему. Спасибо. –

+0

Тогда, пожалуйста, примите ответ, так что другие могут видеть, что вопрос имеет правильный ответ – Kukeltje

ответ

2

Снимите update="@this будет решить. Обновление элемента управления переместит его в состояние по умолчанию. Возможно также, что в более новой версии PF это состояние по умолчанию улучшено, и оно все еще находится в правильном положении.

Смежные вопросы