小编Lou*_*ise的帖子

尝试理解立即="真实"跳过输入,而不应该

就在我以为我立即理解的时候...*叹气*

考虑以下JSF页面:

<h:inputText value="#{testBean.text}" required="true" />
<h:commandButton actionListener="#{testBean.doFoo}" value="Do Foo" />
<h:commandButton immediate="true" actionListener="#{testBean.doBar}" value="Do Bar" /><br />
<h:outputText value="#{testBean.didSomething}" />
Run Code Online (Sandbox Code Playgroud)

而这个支持bean:

public class TestBean {
   private String didSomething = "Nothing done yet";
   // + getter

public void doFoo() {
    didSomething = "Did foo!";        
}

public void doBar() {
    didSomething = "Did bar!";        
}
Run Code Online (Sandbox Code Playgroud)

从我所读到的所有内容中我可以期待以下内容:

  • 当在没有为输入字段提供值的情况下尝试执行foo时,操作永远不会执行,因为在processValidationsPhase发生错误期间,导致在此阶段之后直接重新呈现页面并显示错误消息.didSomething保持不变的价值.(这按预期工作)

  • 当在没有为输入字段提供值的情况下尝试执行bar时,applyRequestValuesPhase由于immediate属性而执行该操作.变量didSomething已更改.(这按预期工作)

接下来会发生什么,这个描述说明:

"null返回值(作为action方法的结果)导致处理继续正常进行,即验证非立即组件然后执行update-model(如果没有发生验证错误).对于返回void的动作侦听器方法,有必要调用facesContext.renderResponse();如果不需要正常流程."

由此我开始认为处理继续正常进行(因为我的动作方法既不返回结果也不返回力renderResponse()),导致相同的验证错误.唯一的区别是它设置发生didSomething.但是,这不会发生.相反,感觉网站仍然会跳过所有剩余的阶段,输入字段未被触及.它重新呈现没有错误消息. …

jsf commandbutton immediate-attribute

23
推荐指数
1
解决办法
4万
查看次数

组件绑定vs findComponent() - 何时使用哪个?

正如在这个问题中所描述的,我尝试在辅助bean端的表单中执行一些字段验证.为此,我想访问违规字段来标记它们.通过搜索网络,似乎有两种方法可以做到这一点:

  • 将组件存储在backing bean中以供访问,并通过该binding属性在JSF页面中使用它们.
  • 在JSF页面中使用标准值绑定,当需要从bean访问组件时,请通过查找 UIViewRoot.findComponent(String id)

至于我可以看到这两种方法都有缺点:组件绑定炸毁支持bean与变量和getter/setter方法,一些网站极力劝阻结合在所有使用组件.无论如何,建议使用请求范围.另一方面,findComponent()总是遍历树,这可能成本也可能不高,对吧?(另外,目前我根本找不到我的组件,但这是另一个问题)

哪条路可走?这些是可互换的替代品,如果没有,根据您选择的标准?目前我只是没有足够的洞察力做出正确的决定......

jsf

6
推荐指数
1
解决办法
3730
查看次数

如何为所有 UIInput 注册(组件)SystemEventListener

我正在尝试创建一个自定义SystemEventListener类型UIInput,用于注册所有类型的实例并对它们的postValidate-Events做出反应。根据我在网上找到的一个例子,我设法HtmlInputText通过faces-config.xml如下注册它来运行它:

<system-event-listener>
   <source-class>javax.faces.component.html.HtmlInputText</source-class>
   <system-event-class>javax.faces.event.PostValidateEvent</system-event-class>
   <system-event-listener-class>com.ourcompany.ourproduct.validators.inputPostValidationListener</system-event-listener-class>
 </system-event-listener>
Run Code Online (Sandbox Code Playgroud)

然后我尝试 1) 将其扩展到一般的 UIInputs 和 2) 使用 @ListenerFor注释,但我似乎无法让其中任何一个工作。

对于 1) 我真的找不到任何示例或文档,所以我只是尝试了 a) 定义多个源类标签或 b) 使用 javax.faces.component.UIInput作为源类。都没有工作。

2)我试过

@ListenerFor(systemEventClass = PostValidateEvent.class, sourceClass = UIInput.class)
Run Code Online (Sandbox Code Playgroud)

它既不适用于 UIInput,也不适用于 html.HtmlInputText。

现在,当我为所有其他类型的 HTML 输入复制相同的 XML 配置时,这确实有效,但它只会使 xml 变得混乱,而且对我来说似乎很烦人。

所以问题是:我通常在@ListenerFor 注释上做错了什么吗?对哪些源类可能有限制,即为什么我不能使用更通用的 UIInput?有没有比重复 XML 更有效的方法来为所有这些不同的输入注册监听器?最后:我宁愿实现ComponentSystemEventListener. 假设上述问题已解决,我只需更改implements-Statement 并相应地实现抽象processEvent,对吗?在这种情况下,这会起作用还是注册/ xml-config 不同(例如,也许<component-system-event-listener>而不仅仅是<system-event-listener>?

(以及作为后记:是只有我还是很难在网络上找到此类内容的任何非平凡示例?)

jsf annotations faces-config systemeventlistener

5
推荐指数
1
解决办法
4025
查看次数

如何通过clientId访问复合组件的兄弟

我有一个复合组件捆绑一些输入字段.该组件将在页面上多次使用,并包含一个用于复制其他组件的值的按钮.为此,我需要通过其clientId访问其中一个兄弟姐妹作为目标

<f:ajax execute=":XXX:siblingId" render="...">

我的问题在于构建此ID.我有兄弟的名字,我可以确保它与包含复制按钮的组件位于相同的命名容器中,但我无法控制完整的嵌套层次结构,因此它可能是:form:foo:bar:parent:child或只是form:parent:child.所以基本上我想获得当前复合组件的前缀,但没有组件自己的ID,然后附加要从中复制的组件的ID.

这与以下问题类似:

但是,这两个答案使用PrimeFaces-sepcific功能,如@parentwidgetVar,这并不适用于我的项目.

在试验EL的隐式对象时,我基本上尝试了与第二个问题的海报相同的东西 - 结果相同:cc.parent.clientId总是空的.我也尝试cc.namingContainer.clientId了两种组合,唉 - 没有成功.特别是parent不能按预期工作的事实让我感到困惑......

那么:是否存在与组件库无关的方式来访问包含复合组件命名容器的"路径"?该如何parent对象应该工作,尤其是:我们什么时候可以使用它,何时不?

PS:我正在考虑使用复合的完整clientId然后修剪它的实际ID fn:split,但是,如果有更直接的方式我会乐意使用它.

jsf clientid naming-containers composite-component

3
推荐指数
1
解决办法
2806
查看次数

什么导致类型不完整?(QGraphicsItem:源或目标具有不完整类型)

我有一个自定义QGraphicsItem,其中(除其他外)使用Qt文档中描述的标准过程将光标更改为单击时打开的手.这在过去两周左右的时间里运作良好.昨天,我在课堂上改变了一些东西.最重要的是,我现在直接从QGraphicsPixmapItem继承而不是QGraphicsItem.

在某些时候我开始得到以下错误(部分是我自己的翻译):

C664:将参数1从'Qt :: CursorShape'转换为'const QCursor&'是不可能的.来源或目标的类型不完整.

我现在试图弄清楚为什么我的项目有一个不完整的类型.不幸的是,当这个问题开始发生时,我无法回溯.改变后的基类是我唯一的猜测,但我真的想不出这是怎么回事.在谷歌搜索错误之后,我找到了一些示例,其中类的成员有些不明确,但我在声明中找不到错误.所以,这是标题,万一我错过了一些东西:

#include <QGraphicsPixmapItem>
class Collection;
class ItemSource;

class PhotoItem : public QGraphicsPixmapItem
{
public:
    PhotoItem( QString sourceFilePath, Collection *collection =0, QColor color =Qt::white, qreal size = 80.0);

    enum Orientation    { portrait, landscape };

    QPixmap content();
    bool hasContent();
    QColor color();

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    QRectF boundingRect() const;

    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);

private:
    qreal _size;
    Orientation _orientation;
    QPixmap _content;
    QColor _color;
    Collection *_collection;
    ItemSource …
Run Code Online (Sandbox Code Playgroud)

c++ qt qgraphicsitem incomplete-type

2
推荐指数
1
解决办法
4020
查看次数

QGraphicsItem中出现奇怪的"不完整类型"错误

可能重复:
导致类型不完整的原因是什么?(QGraphicsItem:源或目标具有不完整类型)

我从这个问题开始:导致类型不完整的原因是什么?(QGraphicsItem:源或目标具有不完整类型)

如上所述,我收到以下错误(部分是我自己的翻译):

C664:将参数1从'Qt :: CursorShape'转换为'const QCursor&'是不可能的.来源或目标的类型不完整.

在试图找出项目可能不完整的原因时,我将其剥离到一个仍然显示错误的最小测试用例.奇怪的是:它绝对最小的......

标题:

#include <QGraphicsPixmapItem>

class PhotoItem : public QGraphicsPixmapItem
{
public:
    PhotoItem();
    void someMethod();

protected:
};
Run Code Online (Sandbox Code Playgroud)

执行:

#include "photoitem.h"

PhotoItem::PhotoItem() : QGraphicsPixmapItem()
{
    QPixmap pxm(80, 80);
    pxm.fill(Qt::cyan);
    setPixmap( pxm );
}

void PhotoItem::someMethod()
{
    setCursor(Qt::OpenHandCursor);
}
Run Code Online (Sandbox Code Playgroud)

它不编译,给出如上所述的错误.但是,在main方法中设置光标item->setCursor(Qt::OpenHandCursor);效果很好.这个错误在其他QGraphicsItems中似乎是持久的(至少我测试了QGraphicsRectItem).

我完全糊涂了,不知道接下来要检查什么.上面的代码是否适用于其他机器/设置?我还可以测试什么来获取更多信息?

谢谢,路易斯

c++ qt qgraphicsitem incomplete-type

2
推荐指数
1
解决办法
1210
查看次数