使用 javascript var 或其他标记值从 JSF 支持 bean 调用函数

Call function from JSF backing bean with javascript var or other tag value

我在这里看到了很多答案,但是 none 为我想要的工作,我需要以不提交表单的方式执行此操作,并使用隐藏按钮方法(使用 ajax call) 并从 javascript 调用 click() 事件,方法被调用,但我需要在方法中传递一个 int,我该怎么做?

我可以从 javascript var 或隐藏的输入文本字段中获取 int,只是不知道该怎么做,有人可以帮忙吗?

JSF 代码:

<script type="text/javascript" language="javascript">
    var position;
</script>

<h:inputHidden id="hiddenHolder" value="#{backingBean.beanPosition}" />

<h:commandButton id="hiddenButton" style="display: none;">
    <f:ajax listener="#{backingBean.testMethod(need to send here javascript var or inputHidden value)}"/>
</h:commandButton>

Bean函数;

public void testMethod(int i){
    //do stuff
}

当我更改 javascript 中的 hiddenHolder 值时,它没有反映在 backingBean 中,我想它需要提交才能工作。这就是为什么我需要在方法调用中传递值。

为此使用 OmniFaces commandScript。效果很好(或者使用 PrimeFaces remoteCommand,如果你已经在使用它的话)

为了防止表单的其余部分被提交,请像调用 f:ajax 一样使用执行属性(p:remoteCommand 上的进程属性)或使用单独的表单

When I change the hiddenHolder value from javascript that is not reflected in the backingBean

您确实没有告诉 JSF 处理输入值。为此应使用 <f:ajax execute>,默认为 @this(当前输入或命令组件)。由于 <f:ajax> 包含在命令组件中,因此只会处理命令组件本身(其操作)。

因此,只需明确指定输入值以及命令组件:

<f:ajax execute="@this hiddenHolder" ... />

或者,如果这一切都在同一个表格中,请使用 @form:

<f:ajax execute="@form" ... />

另请参阅:

  • How to invoke a JSF managed bean on a HTML DOM event using native JavaScript?
  • How to use jsf.ajax.request to manually send ajax request in JSF
  • Calling JSF managed bean method with arguments in jQuery