在@ApplicationScope的ManagedBean中使用ajax进行轮询

3
我对@ApplicationScope在Ajax请求时的操作有些困惑。
我创建了一个小例子来帮助理解。其中,我有:
- 一个slider改变了一个被称为sliderValue的变量,在一个@ApplicationScope的ManagedBean中设置该值,该值由Ajax设置。 - 一个poll,它更新panelGrid以始终获取sliderValue的更新值,更新是通过Ajax完成的。
理论上,所有访问此页面的用户应该具有相同的sliderValue值,如果一个用户更改了滑块的值,其他所有用户都应该接收到更改,对吗?
但事实并非如此。显然,当通过Ajax进行更新时,它会像一个@SessionScope的ManagedBean一样行事。
当我更改sliderValue的值时,它在ManagedBean中被正确地更改,但其他用户通过poll执行的更新没有接收到更新。
我只能在浏览器中进行REFRESH,并对页面进行完全的REFRESH才能更新sliderValue的值。
有人遇到过类似的问题吗?
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Menu</title>
    </h:head>
    <h:body>
        <h:form prependId="false" id="form1" >

            <h:panelGrid id="panelGrid1"  columns="1" style="margin-bottom: 10px">
                <p:inputText id="txt1" value="#{menuManagedBean.sliderValue}" />
                <p:slider id="slider1" for="txt1" >
                    <p:ajax event="slideEnd" process="txt1" />
                </p:slider>
            </h:panelGrid>

            <p:poll id="poll1" widgetVar="varPool1" async="true" autoStart="true" interval="2" update="panelGrid1" />

        </h:form>
    </h:body>
</html>

MenuManagedBean.java

import java.io.Serializable;
import java.util.Date;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@ApplicationScoped
@Named(value = "menuManagedBean")
public class MenuManagedBean implements Serializable {

    private int sliderValue;

    public MenuManagedBean() {
    }

    public int getSliderValue() {
        System.out.println(new Date() + " - get: " + sliderValue);
        return sliderValue;
    }

    public void setSliderValue(int sliderValue) {
        this.sliderValue = sliderValue;
        System.out.println(new Date() + " - set: " + sliderValue);
    }
}

更新一个客户端(比如Chrome)中的值,然后在另一个客户端(比如Firefox)中刷新相同的视图,你会注意到差异。 - Luiggi Mendoza
是的,但我希望在不刷新页面的情况下进行更改。这里使用了投票,但它没有得到修改后的值。 - Douglas Nassif Roma Junior
1个回答

5
<p:poll>默认情况下会提交/处理整个表单,例如<p:poll process="@form">,包括当前滑块的值。您可能已经注意到了一个不必要的set方法调用。每个打开的视图在轮询期间都会提交自己当前的滑块值。这就是为什么每个打开的视图只能看到自己的滑块值(当有“许多”打开的视图时,留下竞态条件)。请告诉<p:poll>只处理自己,而不是整个表单。
<p:poll process="@this" ... />

与具体问题无关:永远不要使用prependId="false"。将其删除。

明白了,所以每次他回来都是旧值! - Douglas Nassif Roma Junior
1
prependId = false 有什么问题吗?这是一种约定还是存在技术问题? - Douglas Nassif Roma Junior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接