希望有人可以提供帮助,因为我非常坚持这个问题。我在其他地方找不到太多帮助...
高级目标:创建一个自定义标签,有助于在 Richfaces 中重用扩展数据表。我有一个自定义标签,我希望类似于:
<mytag:customTable bean="#{myBean}"/>
包含表格代码的(简化)文件如下(table.xhtml)
<!--...header stuff -->
<ui:component>
<a4j:outputPanel>
<h:form>
<rich:extendedDataTable
value="#{bean.theData}"
var="entity"
id="table">
<rich:column filterMethod="#{...}">
<f:facet name="header">
<h:inputText value="#{bean.filterValue}">
<a4j:support event="onkeyup" reRender="table"/>
</h:inputText>
</f:facet>
<h:outputText value="#{entity.item}"/>
</rich:column>
</rich:extendedDataTable>
</h:form>
</a4j:outputPanel>
</ui:component>
由于应用程序的限制,在<rich:column>
标签内使用 filterBy="#{...}" 属性并不能满足我的需求。
因此,我必须使用 filterMethod 属性。当我对表格进行硬编码时,
<rich:column filterMethod="#{bean.filterFunction}">
然后一切正常。但是,我想保持标签更通用,而不是硬编码。相反,我还想传递过滤函数的名称(例如<mytag:customTable bean="#{myBean}" flFcn="#{myBean.filterFunction}">
)。问题是我无法让任何版本的它正常工作。
通过搜索其他线程,我看到将方法传递给“操作”属性的方式具有如下语法:action="#{bean[fcnName]}"
其中 fcnName 只是一个字符串(参见http://digitaljoel.nerd-herders.com/2009/08/25 /passing-action-methods-in-facelets-using-array-notation/)。
我已经确认这种方式在动作时可以正常工作。但是,在这种情况下,这似乎对我使用 filterMethod 没有帮助(也许 b/c 函数签名不同?)。基于这些解决方案,我需要类似
<mytag:customTable bean="#{myBean}" flFcn="filterFunction">
的东西:<rich:column filterMethod="#{bean[flFcn]}">
在有效的 EL 语法的许多排列中,我没有找到任何东西。每次,这种方法都会抛出一个异常,说“bean”解析为空。为了检查 bean 是否被真正识别,我让它通过打印一个字符串<h:outputText value="#{bean.someString}"/>
(删除有问题的 filterMethod=...)并且没有问题。因此,问题似乎完全取决于 filterMethod 收到的任何内容。我在这里发现了一个我认为非常相似的问题,但似乎没有得到回答。
提前致谢!