从javascript

时间:2017-02-17 15:27:00

标签: javascript jsf primefaces jsf-2 jsf-2.2

在我的应用程序中,我调用了一个Javascript事件,该事件调用名为p:remoteCommand的{​​{1}}如下:

checkPageLayoutsAreSelected

这是$('selector').on('click', function (e) { checkPageLayoutsAreSelected(); });

p:remoteCommand

这个<p:remoteCommand name="checkPageLayoutsAreSelected" actionListener="#{beanFormDashboard.checkPageLayoutsAreSelected}" /> 将调用p:remoteCommand托管bean中的一个方法,该方法将返回一个布尔值:

beanFormDashboard

所以我想从Javascript代码中的托管bean获取public Boolean checkPageLayoutsAreSelected(){ for(DashboardPage dp : dashboardPageList){ if(dp.getModel() == 0){ return false; } } return true; } 的返回值。

这样的事情:

checkPageLayoutsAreSelected()

我该怎么做?

2 个答案:

答案 0 :(得分:4)

checkPageLayoutsAreSelected不会返回值或甚至是承诺,但您可以使用Ajaxicaly返回值。

<p:remoteCommand name="checkPageLayoutsAreSelected"
     action="#{beanFormDashboard.checkPageLayoutsAreSelected()}"
     oncomplete="getLayoutAreSelectedResult(xhr, status, args);"
/>

在方法checkPageLayoutsAreSelected()中,您使用PF提供的RequestContext将结果发送回客户端:

public void checkPageLayoutsAreSelected() {
   Boolean result=true;
   for(DashboardPage dp : dashboardPageList){
        if(dp.getModel() == 0){
            result= false;
        }
   }
   RequestContext reqCtx = RequestContext.getCurrentInstance();        
   reqCtx.addCallbackParam("returnedValue", result);
}

在Javascript回调函数getLayoutAreSelectedResult(xhr, status, args)中,您将获得返回值:

$('selector').on('click', function (e) {
    checkPageLayoutsAreSelected();
    window.getLayoutAreSelectedResult= function(xhr, status, args) {
       var returnedValue = args.returnedValue;
       console.log(returnedValue);
    }
});

答案 1 :(得分:0)

另一个答案是有效的并且给你完整的xhr访问权限,但理论上你可以在任何时间点执行此操作,将某些内容放入requestScope并重新渲染然后从EL中取出。我个人更喜欢在页面上显示元素,因为我们以后可能会将它们用于任何类型的信息,但这是另一种方法。参考bean数据设置一个隐藏元素,并将其包装成可以重新渲染的组件。

然后在checkPageLayoursAreSelected中,在bean上设置该对象的值,让remoteCommand渲染/更新元素的组件包装器,然后使用基本的JS或Jquery从dom获取值

工作示例:

view.xhtml

  <button type="button" id="buttonClicker" class="buttonClicker" >Click Me</button>

  <p:remoteCommand name="checkPageLayoutsAreSelected" actionListener="#{testBean.checkPageLayoutsAreSelected}" update="pageLayoutSelected" oncomplete="showVal()"/>

  <h:panelGroup id="pageLayoutSelected">
       <h:inputHidden  value="#{testBean.pageLayoutSelected}" id="checkPageLayoutValueId" />
  </h:panelGroup>

  <script>
    $('.buttonClicker').on('click', function (e) {
         checkPageLayoutsAreSelected();
    });
    function showVal() {
        alert($("[id$='checkPageLayoutValueId']").val());
    };
  </script>

TestBean.java

    private Boolean pageLayoutSelected;

    public Boolean checkPageLayoutsAreSelected(ActionEvent event) {
        if (pageLayoutSelected == null || pageLayoutSelected == Boolean.FALSE) {
            pageLayoutSelected = Boolean.TRUE;
        } else {
            pageLayoutSelected = Boolean.FALSE;
        }

    return pageLayoutSelected;
}
getters/setters

我已添加一条警告,告诉您数据已被修改。

重要的是,你需要在完成阶段完成它 - 因为它绝对确定dom渲染已经完成,如果JS运行得足够快,那么DOM可能仍然具有较旧的值。 / p>

希望这有帮助。