Существует 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);
}
}
Как было предложено в другой вашей соответствующей должности: попробовал новую версию? – Kukeltje
Спасибо, что ответили. Я использовал версию 5.1 вместо 5.0. –
В своем сообщении вы заявили, что уже используете 5.1. Но это работает сейчас? – Kukeltje