【问题标题】:What would be the best way to read values from <h:selectOneMenu /> to javascript function?从 <h:selectOneMenu /> 读取值到 javascript 函数的最佳方法是什么?
【发布时间】:2015-02-14 20:59:43
【问题描述】:

我有 jQuery 模态 div,它显示在点击事件上......

<div id="time_scheduler" style="display: none;" title="Change Event Time"   class="dialog">
    <div class="block">
        <h:form>
            <span>Select Shift</span>
            <p></p>
            <h:selectOneMenu value="#{fieldController.shift}">
                <f:selectItems itemLabel=" #{s.shiftName}  &nbsp; &nbsp; &nbsp;   #{s.startTime} to #{s.endTime}" var="s" value="#{fieldController.allShiftUnfiltered}" /> 
                <f:converter converterId="shconvert" />
            </h:selectOneMenu> 
            <p></p>  
            <h:commandButton onclick="getShift('#{request.contextPath}/changeEvent?','#{fieldController.shift.startTime}','#{fieldController.shift.endTime}');" styleClass="btn btn-small" value="change" />
        </h:form>
    </div>
</div>

还有一个 js 文件中的 javascript 函数,它在 commandButton 中被调用,问题是每次页面显示时,我点击后在 selectOneMenu 上得到一个空值,然后我得到这个值,虽然它不一致,

function getShift(url,start_time,end_time){
    console.log('starttime is '+start_time); //start time is null on page first load
    console.log('endtime is '+end_time);     //end time is null on first page load

    $.ajax({
        url: url + 'event_id=' + event_id + '&start_time=' + start_time + '&end_time=' + end_time,
        cache: false,
        success: function(value) {
            console.log(value);  
        }
    });
}

我有一个转换器类

@FacesConverter(value = "shconvert")
public class ShiftConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        AdminEJB adm;
        try {
            adm = (AdminEJB) new InitialContext().lookup("java:global/ffm/AdminEJB");
            return adm.findShift(value);
        } catch (NamingException ex) {
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
      return value.toString();
    }
}

这几乎是在构建后级别进行转换,每次更改时将这些值传递给 javascript 函数的最佳方式是什么?

【问题讨论】:

    标签: javascript jquery jsf managed-bean


    【解决方案1】:

    commandButton 的设置方式将使其使用最后提交的值来调用 javascript 函数。在解决这个问题之前,我们可能想了解 EL、JSF 和 Javascript 之间的关系。 JSF 获取 facelet 代码并将其转换为 HTML。那时任何 EL 语句都在服务器端解析。所以,当一切都说完了,我们就有了一个可以在我们最喜欢的浏览器中检查的 HTML 页面。现在出现了 Javascript,它不知道 JSF,所以它只在呈现的 HTML 页面上工作。

    考虑到这一点,我们可以看到为什么上面的代码不起作用。用作 getShift Javascript 函数参数的 EL 语句只有在服务器重新呈现页面的该部分时才会被解析。

    看起来这里的目标是在单击按钮时异步调用非 JSF servlet。我会以不同的方式解决这个问题。让 commandButton 异步调用 JSF 方法,该方法可以访问自定义 servlet。

    <div id="time_scheduler" style="display: none;" title="Change Event Time"   class="dialog">
    <div class="block">
        <h:form>
            <span>Select Shift</span>
            <p></p>
            <h:selectOneMenu value="#{fieldController.shift}">
                <f:selectItems itemLabel=" #{s.shiftName}  &nbsp; &nbsp; &nbsp;   #{s.startTime} to #{s.endTime}" var="s" value="#{fieldController.allShiftUnfiltered}" /> 
                <f:converter converterId="shconvert" />
            </h:selectOneMenu> 
            <p></p>  
            <h:commandButton styleClass="btn btn-small" value="change">
               <f:ajax execute="@form" listener="#{someBean.callServlet()} />
            </h:commandButton>
        </h:form>
    </div>
    

    然后,使用调用 servlet 的方法创建一个支持 bean

    @Named
    public class SomeBean {
        @Inject FieldController fieldController;
        public String callServlet() {
          Object startTime = fieldController.shift.startTime;
          Object endTime = fieldController.shift.endTime;
    
          //Call the servlet here
    
          return null;
        }
    }
    

    这是来自 java 的 example on calling a servlet

    【讨论】:

    • 感谢@Ali cheaito,实际上这个想法是将托管 bean 值传递给 javascript 客户端,然后再进行 ajax 服务器端调用。我试图以这种方式实现它,因为如果您注意到 javascript 方法中有一个名为 event_id 的变量,则 javascript 存储由 jquery 组件初始化的全局变量,该变量实际上是由自定义 jquery 组件初始化的,这有什么头吗?或者有没有办法可以在托管或 cdi bean 中检索 jquery /js 初始化值?
    • 我不知道 event_id 是如何使用提供的代码创建的。它看起来特定于您的应用程序。如果您必须使用它,请将其分配给 h:inputHidden 并将其绑定到支持 bean 中的字段以从 JSF 端读取它并将其包含在 servlet 请求中。
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2016-08-10
    • 2010-09-07
    • 2020-03-20
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多