【问题标题】:JSF 2 - passing parameters accross system eventsJSF 2 - 跨系统事件传递参数
【发布时间】:2010-08-24 15:57:37
【问题描述】:

我有一个复合组件,我传入一个任意定义的属性:

<x:mycomp x="..."/>

x 在 cc 的接口定义中被这样定义。在mycomp 的实现内部我有一个事件监听器:

<composite:implementation>
    <f:event type="preRenderComponent" listener="#{mycontroller.init}" />
</composite:implementation>

现在我想用这个任意参数x 在后端做一些事情。如何通过系统事件传递它,例如使用f:attribute 标签?还是从事件中获取源组件并通过其内部进行拖网? (说到这些属性在 UIComponent 中存储的位置 - 我找不到它们,反正不是在属性中)。

如果不可能,这会严重限制系统事件的有用性。如果您将组件放在 ui:repeat 中,则侦听器会被多次触发,因此它会在事件触发期间遍历树。

我唯一能想到的就是将 init 直接编码到渲染中:

<composite:implementation>
    #{mycontroller.init(cc.attrs.x)} //returns empty string
    <!--f:event type="preRenderComponent" listener="#{mycontroller.init}" /-->
</composite:implementation>

但我认为这就是预渲染系统事件的用途。

【问题讨论】:

  • 抱歉,我已阅读您的问题多达 3 次,但我似乎无法过滤/理解底层功能需求。您能否更新您的问题以详细说明一下?
  • 哇,快!我正在将一个属性传递给一个复合组件。假设它必须在渲染之前以某种方式进行装饰。系统事件可以获取该属性“x”以便在服务器上使用它吗?与您在网站中描述的关于通过动作监听器传递参数的事情相同(如果您是同一个人balusc.blogspot.com/2006/06/communication-in-jsf.html),除了这次它是事件监听器,而不是动作监听器。本质上,我正在寻找一种在渲染之前初始化传入参数的方法。

标签: jsf jsf-2


【解决方案1】:

也许答案有点晚了。

我对我认为您要解决的问题进行了概念验证。为了做到这一点,您必须取出您的活动注册并在您的复合材料的使用页面中进行。您的 init 方法可以接收一个 ComponentSystemEvent,它将为您提供复合组件,然后您可以从组件的属性映射中访问您的“x”属性。

使用页面中的代码是这样的:

&lt;x:mycomp x="hola"&gt;
&lt;f:event type="preRenderComponent" listener="#{bean.init}"/&gt;
&lt;/x:mycomp&gt;

还有java代码:

public class MyBean {
   private String value;

   public void init(ComponentSystemEvent e){
       System.out.println("x: "+e.getComponent().getAttributes().get("x"));
   }

}

我希望它会有用(几个月后)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多