【问题标题】:JSF - Two Questions about actions on UIComponentJSF - 关于 UIComponent 上的操作的两个问题
【发布时间】:2010-12-01 16:43:59
【问题描述】:

所以,让我告诉我们我的烦恼:)

1 - 当我点击命令按钮时

<h:commandButton value="Somethings">
    <f:setPropertyActionListener target="#{bean.method}" value="some" />
    <f:ajax render="rendering"/>
</h:commandButton>

我没有对commandButton 执行任何操作。只是我触发了ajax调用。如果我在按钮上添加一个操作(如action="bean.myAction),它将在 JSF 生命周期的 5° 阶段执行(好吧,只有当我在 f:ajax 中写入 event="action" 时,但这是默认设置)。对?但是 f:ajax 默认是通过点击按钮来触发的吗?因为例如对于 ListBox,它只有在我写 event="change" 时才会被触发(同样,我不应该写它,因为它是默认的)。

2 - 当我点击图片时

<h:graphicImage value="img/img.png" alt="img">
    <f:setPropertyActionListener target="#{bean.method}" value="some" />
    <f:ajax event="onclick" render="rendering"/>
</h:graphicImage>

这不起作用。为什么?

像往常一样,感谢您的帮助!!!!

【问题讨论】:

    标签: jsf jsf-2 action facelets


    【解决方案1】:

    1 - 当我点击命令按钮时

    我没有对 commandButton 执行任何操作。只是我触发了ajax调用。如果我在按钮上添加一个动作(如 action="bean.myAction),它将在 JSF 生命周期的 5° 阶段执行

    f:setPropertyActionListener 也将在第 5 阶段执行。

    (好吧,仅当我在 f:ajax 中写入 event="action" 时,但这是默认设置)。对?但是 f:ajax 默认是通过点击按钮来触发的吗?因为例如对于 ListBox,它只有在我写 event="change" 时才会被触发(同样,我不应该写它,因为它是默认的)。

    f:ajax 只是将行为从同步提交更改为异步(部分)提交。它通过为父组件的所需事件属性生成一些额外的 JavaScript 代码来实现这一点(例如,onclickonchange 等,在 webbrowser 中查看生成的 HTML 输出)。它不会改变 JSF 生命周期中的任何内容。只有呈现的响应将是部分响应,这正是要在组件中更新的部分,其 ID 在render 属性中定义。


    2 - 当我点击图片时

    这不起作用。为什么?

    因为h:graphicImage 根本不支持f:setPropertyActionListener。它仅适用于UICommand 组件。

    您想将其包装在 h:commandLink 中。

    <h:commandLink>
        <f:setPropertyActionListener target="#{bean.method}" value="some" />
        <f:ajax event="action" render="rendering"/>
        <h:graphicImage value="img/img.png" alt="img"/>
    </h:commandLink>
    

    (如有必要,使用 CSS 设置由生成的 &lt;a&gt; 元素引起的边框/下划线样式)

    【讨论】:

    • 第一个问题:好的。但是我仍然不明白的是:对于 ListBox,例如,当 ListBox 更改时会调用 f:ajax。 (event="change")。但是对于按钮?怎么说呢,当你按下它时,你需要在上面执行代码?这是我认为的默认行为,还是我忘记了什么?
    • UICommand(实际上是ActionSource)组件的默认f:ajax事件是click。另请参阅我在答案中链接的f:ajax PDL 文档中对event 属性的描述(我的答案中的所有蓝色代码部分实际上都是官方参考文档的链接)。
    • 嗯。所以如果我在commandButton 上写我自己的action="bean.myFunction" 并且我使用f:ajax event="click" 操作不会被执行?
    • 它将被执行。 f:ajax 仅将其从同步(正常/完整)提交更改为异步(ajaxical/部分)提交。撇开 JSF 不谈,你明白 Ajax 的全部意义是什么吗?
    • 那么:f:ajax event="action" 是什么意思? :)
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多