【问题标题】:Passing valueChangeListener method expression into tag file将 valueChangeListener 方法表达式传递到标记文件中
【发布时间】:2012-06-23 20:17:36
【问题描述】:

我有一个<h:inputText>,它带有如下事件监听器:

<h:inputText valueChangeListener="#{myBean.handle}"/>

我想把它放在一个标签文件中,如下所示:

<my:itext changeListener="#{myBean.handle}" />

标签文件里面有:

<h:inputText valueChangeListener="#{changeListener}" />

但是,它将其评估为属性而不是侦听器方法。如何将侦听器方法传递到标记文件中?

【问题讨论】:

  • 也就是说&lt;my:itext&gt;实际上并不是一个组件,而是一个标签文件?
  • 是的@BalusC "itext" 定义在一个名为 "my" 的标记空间中,我需要在实际组件 (h:inputText) 之外但在调用者 (谁编写 my:itext . ..)
  • 您使用的是 JSP 还是 Facelets?哪个版本?
  • 我在Seam环境中,除了jstl jsf richfaces注入/输出之外不能使用。
  • 我没有问这个。您使用的是 JSP 还是 Facelets?简单来说,您的 JSF 页面是否有 .jsp.xhtml 扩展名?

标签: jsf tagfile


【解决方案1】:

您可以通过设计不将方法表达式作为标记文件属性传递。您基本上需要在标签文件中将ValueExpression 转换为MethodExpression

对于 JSF 2.x Facelets,可以使用 OmniFaces &lt;o:methodParam&gt; 解决此问题。

<o:methodParam name="changeListenerMethod" value="#{changeListener}" />
<h:inputText valueChangeListener="#{changeListenerMethod}" />

但是,对于旧的和已弃用的 Facelets 1.x 或 JSP 2.x,没有现成的解决方案。然而,OmniFaces &lt;o:methodParam&gt; 是开源的,如果需要,您应该能够为 Facelets 1.x 或 JSP 复制和更改它。

请注意,当您实际上已经在使用 JSF 2.x 时,您也可以使用 composite component 代替。这支持将方法表达式作为&lt;cc:attribute method-signature&gt; 传递。对于 JSF 1.x,您也可以另外创建一个 real 自定义组件,但这比一些 XML 工作要多一些。

【讨论】:

  • 嗯。 valueChangeListener="#{bean.changeListenerMethod}" 需要该 bean 有一个方法 changeListenerMethod(ValueChangeEvent e) 我使用它!传递“控制器”的问题是没有传递changeListenerMethod的ValueChangeEvent参数,所以我无法对valuechangeevent做一些工作。叹息!
  • 我不确定我是否理解您的具体问题。我已经回答过了。
  • 对不起@BalusC 但我不能使用其他库(即使是免费的或开放的)。我想我会创建我自己的大组件。我会在谷歌上搜索指南。
  • 我关闭了这个问题,因为我看到,就像@BalusC 告诉我的那样,没有任何插件库在 JSF 1.2 中是没有办法的。我正在尝试使用“普通”a4j:support 来执行此操作。希望这种方式能让我走上正确的道路……
猜你喜欢
  • 2014-01-02
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多