2015-04-02 1 views
0

Существует p: selectOneListbox с примерно 20 элементами. Первые 5 элементов можно просмотреть в списке, а остальные можно прокрутить и выбрать. Список ajaxified. Элемент списка выбран, и при нажатии кнопки удаления ajax элемент удаляется, и выбирается следующий элемент. Это прекрасно работает. Но полоса прокрутки списка перемещается в верхнюю часть, а вновь выбранный элемент не отображается - когда элементы с индексом больше 5. Приложение использует PrimeFaces 5.1.p: selectOneListbox ajax item удалить изменения прокрутить позицию вверх

Я также пробовал это с Apache MyFaces 2.0 - используя f: ajax, h: selectOneListbox и h: commandButton вместо соответствующих тегов p:. Код управляемого компонента остался прежним. В этом случае он отлично работает - полоса прокрутки не перемещается вверх (просто при необходимости настраивается). Мне хотелось бы, чтобы подобное поведение с тегами Primefaces.

Код страницы JSF:

<p:selectOneListbox id="list" scrollHeight="100" 
    value="#{bean.todo}"> 
    <f:selectItems value="#{bean.data}" /> 
    <p:ajax process="@this" update="msg" 
    listener="#{bean.valueChanged}" /> 
</p:selectOneListbox> 

<br /> 
<p:commandButton value="Delete"> 
    <p:ajax process="@this" update="list msg" 
    listener="#{bean.deleteListener}"/> 
</p:commandButton> 

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

Код фасоли:

package example; 

import javax.faces.bean.SessionScoped; 
import javax.faces.bean.ManagedBean; 
import java.io.Serializable; 
import java.util.List; 
import java.util.ArrayList; 
import javax.faces.event.AjaxBehaviorEvent; 
import javax.faces.component.UIOutput; 

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

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

    public TodosBean() { 
     loadData(); 
     String t = data.get(0); 
     setTodo(t); // select the first item in the list 
     setMessage(t); 
    } 

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

    public List<String> 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 t = (String) ((UIOutput) e.getSource()).getValue(); 
     setMessage(t + " selected."); 
    } 

    public void deleteListener(AjaxBehaviorEvent e) { 
     if (data.size() == 0) { 
      return; 
     } 
     String t = getTodo(); 
     setMessage(t + " deleted."); 
     int ix = data.indexOf(t); 
     data.remove(t); 
     // select an item 
     if (data.size() == 0) { 
      setTodo(""); 
      return; 
     } 
     if (ix == data.size()) { 
      ix = ix - 1; 
     } 
     t = data.get(ix); 
     setTodo(t); 
    } 
} 
+0

Как было предложено в другой вашей соответствующей должности: попробовал новую версию? – Kukeltje

+0

Спасибо, что ответили. Я использовал версию 5.1 вместо 5.0. –

+0

В своем сообщении вы заявили, что уже используете 5.1. Но это работает сейчас? – Kukeltje

ответ

0

Ниже приводится статья на прокрутку к выбранной строке в р: DataTable. Элементы таблицы сортируются. После добавления, обновления или удаления прокрутки прокрутки к выбранному элементу - и выбранный элемент будет виден. Сценарий jQuery, упомянутый в статье, также может быть применен к p: selectOneListBox.

JSF p:dataTable - Scroll to Selected Row

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