p:selectOneListbox ajax项目选择更改滚动位置

时间:2015-04-01 07:13:38

标签: ajax jsf primefaces selectonelistbox

<p:selectOneListbox>个约20个项目。可以在列表中查看前5个项目,然后可以滚动并选择其余项目。该列表是ajaxified。当选择大于5的项目编号时(滚动到它后),滚动条不会保留在其位置;它移动到顶部位置。这使得所选项目(例如项目9)不可见。该程序使用ajax监听器。该应用程序使用PrimeFaces 5.0。

但是,当删除ajax监听器时,所选(第9项)是可见的,滚动条不会移到顶部(在下面的JSF页面中删除p:ajax标签的监听器属性)。

我想知道当使用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;
    }
}

1 个答案:

答案 0 :(得分:2)

删除update="@this将解决它。更新控件会将其移至默认状态。也可能是在较新版本的PF中,此默认状态得到改善,并且仍处于正确的位置