就在我以为我立即理解的时候...*叹气*
考虑以下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
.但是,这不会发生.相反,感觉网站仍然会跳过所有剩余的阶段,输入字段未被触及.它重新呈现没有错误消息. …
正如在这个问题中所描述的,我尝试在辅助bean端的表单中执行一些字段验证.为此,我想访问违规字段来标记它们.通过搜索网络,似乎有两种方法可以做到这一点:
binding
属性在JSF页面中使用它们.UIViewRoot.findComponent(String id)
至于我可以看到这两种方法都有缺点:组件绑定炸毁支持bean与变量和getter/setter方法,一些网站极力劝阻结合在所有使用组件.无论如何,建议使用请求范围.另一方面,findComponent()总是遍历树,这可能成本也可能不高,对吧?(另外,目前我根本找不到我的组件,但这是另一个问题)
哪条路可走?这些是可互换的替代品,如果没有,根据您选择的标准?目前我只是没有足够的洞察力做出正确的决定......
我正在尝试创建一个自定义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>
?
(以及作为后记:是只有我还是很难在网络上找到此类内容的任何非平凡示例?)
我有一个复合组件捆绑一些输入字段.该组件将在页面上多次使用,并包含一个用于复制其他组件的值的按钮.为此,我需要通过其clientId访问其中一个兄弟姐妹作为目标
<f:ajax execute=":XXX:siblingId" render="...">
我的问题在于构建此ID.我有兄弟的名字,我可以确保它与包含复制按钮的组件位于相同的命名容器中,但我无法控制完整的嵌套层次结构,因此它可能是:form:foo:bar:parent:child
或只是form:parent:child
.所以基本上我想获得当前复合组件的前缀,但没有组件自己的ID,然后附加要从中复制的组件的ID.
这与以下问题类似:
但是,这两个答案使用PrimeFaces-sepcific功能,如@parent
和widgetVar
,这并不适用于我的项目.
在试验EL的隐式对象时,我基本上尝试了与第二个问题的海报相同的东西 - 结果相同:cc.parent.clientId
总是空的.我也尝试cc.namingContainer.clientId
了两种组合,唉 - 没有成功.特别是parent
不能按预期工作的事实让我感到困惑......
那么:是否存在与组件库无关的方式来访问包含复合组件命名容器的"路径"?该如何parent
对象应该工作,尤其是:我们什么时候可以使用它,何时不?
PS:我正在考虑使用复合的完整clientId然后修剪它的实际ID fn:split
,但是,如果有更直接的方式我会乐意使用它.
我有一个自定义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) 我从这个问题开始:导致类型不完整的原因是什么?(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).
我完全糊涂了,不知道接下来要检查什么.上面的代码是否适用于其他机器/设置?我还可以测试什么来获取更多信息?
谢谢,路易斯