将html元素传递给a4j的oncomplete函数:jsFunction

时间:2016-06-09 12:58:05

标签: javascript jsf richfaces

我需要将<a4j:jsFunction>的调用html元素传递给它的oncomplete函数。我看到了this回答,但是我不认为将html元素(作为一个字符串,我想?)传递给bean并且背面非常优雅,我觉得它有点乱。

这是我的代码

<td class="col-md-2 clickable text-right"
        onclick="orderBy('getAmount','DESC')">
    #{msg.label_amount}
</td>

<a4j:jsFunction name="orderBy" action="#{backingBeanRef['orderBy']}"
        oncomplete="afterOrderBy()" 
        render="list_form" >
    <a4j:param name="ref" assignTo="#{backingBeanRef['orderByMethodName']}"/>                               
    <a4j:param name="ref2" assignTo="#{backingBeanRef['orderBySortOrder']}"/>
</a4j:jsFunction>

问题

有没有办法将html元素传递给a4j:jsFunction,并将其传递给它的oncomplete回调函数,而不将html元素发送到bean并返回?

理想的解决方案是为调用方添加一个参数,如orderBy(... , this)和jsFunction的相应参数,如<a4j:param name="element"/>

<td class="col-md-2 clickable text-right"
        onclick="orderBy('getAmount','DESC',this)">
    #{msg.label_amount}
</td>

<a4j:jsFunction name="orderBy" action="#{backingBeanRef['orderBy']}"
                    oncomplete="afterOrderBy(element)" 
                    render="list_form" >
    <a4j:param name="ref" assignTo="#{backingBeanRef['orderByMethodName']}"/>                               
    <a4j:param name="ref2" assignTo="#{backingBeanRef['orderBySortOrder']}"/>
    <a4j:param name="element"/>
</a4j:jsFunction>

但它不起作用。我在js函数的第一行有一个断点,它没有被调用。

我刚刚将..,this)添加到了金额列(我显示的唯一一个),所以如果我点击其他列(没有{{1>} 1}})我的js函数被调用,只有参数未定义。

那么,有可能这样做吗?

修改

如果我尝试不添加任何..,this),并按this answer指示执行<a4j:param>,则发送到js函数的元素是一个范围(当我调试/将其记录到控制台时,它没有oncomplete="afterOrderBy(this)"个孩子,而且是

.source

This answer也指出了一些方法来做类似的事情但不是这样。

EDIT2

请阅读

中的文档
  

[...]不建议在里面使用use关键字   EL表达式,因为它不会总是指向组件所在的位置   Ajax请求已启动。[...]

所以... outerHTML: "<span id=\"sgfrmId:j_idt601\" style=\"display: none;\"></span>" ...做错了。

提前致谢。

1 个答案:

答案 0 :(得分:1)

a4j:jsFunction仅用于触发ajax请求,oncomplete作为服务器响应的一部分执行(即不在函数的上下文中),只需将元素引用保存到全局变量并使用不完整的代码那个变量。

E.g。

<td onclick="sourceElement=this; orderBy();">…</td>

afterOrderBy = function() {
     // do something with sourceElement …
}