如何通过ajax刷新JSF填充的javascript变量?
我想做以下工作: 从h:SelectOne菜单中选择一项 通过ajax用新值更新backingbean 使用新值运行Javascript函数 但在下面的代码中,警报{backingBean.derivedValue}仍然包含上次更改的值,即选择两个时为0,选择一个时为4,依此类推:如何通过ajax刷新JSF填充的javascript变量?,javascript,ajax,jsf,Javascript,Ajax,Jsf,我想做以下工作: 从h:SelectOne菜单中选择一项 通过ajax用新值更新backingbean 使用新值运行Javascript函数 但在下面的代码中,警报{backingBean.derivedValue}仍然包含上次更改的值,即选择两个时为0,选择一个时为4,依此类推: <h:form> <h:selectOneMenu value="#{backingBean.input1}"> <f:selectItem itemLabel=
<h:form>
<h:selectOneMenu value="#{backingBean.input1}">
<f:selectItem itemLabel="One" itemValue="1"/>
<f:selectItem itemLabel="Two" itemValue="2"/>
<f:ajax render="@form" onevent="function(data) { if (data.status === 'success') { alert(#{backingBean.derivedValue}) }}"/>
</h:selectOneMenu>
Input value: #{backingBean.input1}
Derived value: #{backingBean.derivedValue}
</h:form>
有办法做到这一点吗?顺便说一句,我在这个网站上读过无数关于JSF/ajax/javascript协同工作的帖子,但不是这个具体问题,我成功地实现了这个答案中提出的解决方案,它用于在服务器端添加javascript回调参数 这是我的Facelets页面:
<h:form>
<p:selectOneMenu value="#{backingBean.input1}">
<f:selectItem itemLabel="One" itemValue="1"/>
<f:selectItem itemLabel="Two" itemValue="2"/>
<p:ajax oncomplete="afterLoad(xhr, status, args)"/>
</p:selectOneMenu>
<h:outputScript>
function afterLoad(xhr, status, args) {
alert("Input * 2 = " + args.derived);
}
</h:outputScript>
</h:form>
我不知道这是否是集成JSF和D3的好解决方案
另见
删除内联javascript并使用不引人注目的脚本事件处理程序要简单得多。在一个命名函数中做你需要的所有事情我不喜欢内联做。你能提供一个你正在谈论的例子吗?我不熟悉脚本事件处理程序的含义。我试过让onevent=refresh\u on_success指向函数refresh\u on_successdata,但我有同样的问题……重新编辑2:我认为你是对的,@wsaxton。看看页面的HTML源代码,看看Javascript是怎么说的。@DavidS,HTML肯定会显示旧值,旧值会出现在Javascript调用中,所以…这当然是一个计时问题。也许AJAX标记中的EL表达式不像其他标记那样呈现?我看到了相同的行为,@wsaxton。我可以使用h:outputText在页面上显示新的durationDerivedValue,但如果在函数中使用Javascript警报,则会显示旧的值。我们可能误解了EL的一些基本原理。这可能是一个解决办法,但有点混乱。我真希望能有一个简单的方法。不幸的是,我最终将JSF和D3完全分开,只使用URL在它们之间传递信息。我理解想要更简单的东西,但我不同意这是一个解决方法或混乱。它只是将一个JSON参数传递给Javascript回调,这就是标准RESTAPI的工作方式。这正是PrimeFace的RequestContext的设计目的,也是支持JSF ajax的组件在幕后所做的。尽管如此,我明白我想要一个更简单的解决方案——我自己对此并不满意。
<h:form>
<p:selectOneMenu value="#{backingBean.input1}">
<f:selectItem itemLabel="One" itemValue="1"/>
<f:selectItem itemLabel="Two" itemValue="2"/>
<p:ajax oncomplete="afterLoad(xhr, status, args)"/>
</p:selectOneMenu>
<h:outputScript>
function afterLoad(xhr, status, args) {
alert("Input * 2 = " + args.derived);
}
</h:outputScript>
</h:form>
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;
@ManagedBean
@ViewScoped
public class BackingBean {
private int input1;
private int derivedValue;
public int getDerivedValue() {
return derivedValue;
}
public void setDerivedValue(int derivedValue) {
this.derivedValue = derivedValue;
}
public int getInput1() {
return input1;
}
public void setInput1(int input1) {
this.input1 = input1;
derivedValue = input1 * 2;
RequestContext.getCurrentInstance().addCallbackParam("derived", derivedValue);
}
}