Dou*_*ior 3 ajax jsf primefaces
我无法理解@ApplicationScopeAjax发出请求的时间.
我创建了一个小例子来促进理解.我有的地方:
slider改变称为变量sliderValue中的ManagedBean @ApplicationScope,该值是由设定的Ajax.poll正在更新panelGrid以始终获取更新的值sliderValue,更新由Ajax完成.从理论上讲,访问此页面的所有用户都应具有相同的值sliderValue,如果用户更改了滑块的值,则其他所有用户都应收到更改,对吧?
但这不会发生.显然,当通过Ajax进行更新时,他的行为类似于ManagedBean @SessionScope.
当我更改其值时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>
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
所述<p:poll>的提交/默认过程的整个形式,如<p:poll process="@form">.包括当前滑块值.您应该通过不必要的set方法调用注意到它.每个打开的视图在轮询期间提交其自己的当前滑块值.这就是为什么每个开放视图只能看到自己的滑块值(当有"很多"打开视图时,不考虑竞争条件).
告诉<p:poll>我们只处理自己,而不是整个表格.
<p:poll process="@this" ... />
Run Code Online (Sandbox Code Playgroud)
与具体问题无关:不要永远使用prependId="false".摆脱它.
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |