当Ajax发出请求时,我无法理解@ApplicationScope
的操作。
我创建了一个小例子来促进理解。我在哪里:
slider
更改了sliderValue
的ManagedBean中名为@ApplicationScope
的变量,该值由Ajax设置。poll
更新panelGrid
以始终获取sliderValue
的更新值,更新由Ajax完成。 从理论上讲,访问此页面的所有用户都应具有sliderValue
的相同值,如果用户更改了滑块的值,则其他所有用户都应收到更改,对吧?
但这不会发生。显然,当通过Ajax进行更新时,他的行为类似于@SessionScope
的ManagedBean。
当我更改sliderValue
的值时,它正在ManagedBean中正确更改,但其他用户不会通过poll
执行的更新收到更新。
如果我在浏览器中提供REFRESH并在页面上执行完整的REFRESH,我只能更新sliderValue 值。
是否有人遇到类似问题?
的index.xhtml
<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);
}
}
答案 0 :(得分:5)
<p:poll>
默认提交/处理<p:poll process="@form">
中的整个表单。包括当前滑块值。您应该通过不必要的set
方法调用注意到它。每个打开的视图在轮询期间提交其自己的当前滑块值。这就是为什么每个开放视图只能看到自己的滑块值(当有“很多”打开视图时,不考虑竞争条件)。
告诉<p:poll>
仅处理自己,而不是整个表单。
<p:poll process="@this" ... />
无关具体问题:请勿使用prependId="false"
。摆脱它。