Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过ajax刷新JSF填充的javascript变量?_Javascript_Ajax_Jsf - Fatal编程技术网

如何通过ajax刷新JSF填充的javascript变量?

如何通过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:SelectOne菜单中选择一项 通过ajax用新值更新backingbean 使用新值运行Javascript函数 但在下面的代码中,警报{backingBean.derivedValue}仍然包含上次更改的值,即选择两个时为0,选择一个时为4,依此类推:

<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);
    }
}