- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Tapestry 页面,其中有两个具有不同参数的 onActivate() 方法。
//在这种情况下调用这两个方法
void onActivate(String filterSetJson) {
schema = getSchema();
if (ValueHelper.isDefined(filterSetJson) && !filterSetJson.equals("all")) {
setFilterSet( filterSetJson );
}
else {
setFilterSet("{}"); // Empty filter set
}
this.loadedTagSummary = false;
sortOrderForTags="count";
sortOrderForTypes="count";
}
void onActivate(String filterSetJson, int pageCount) {
//onActivate( filterSetJson );
this.pageCount = pageCount;
}
有时此页面会使用两个参数调用,有时则使用一个参数。问题是,当使用两个参数调用页面时,两个 onActivate() 方法都会被调用。仅应调用接受两个参数的方法。
正如下面链接中所建议的,我修改了代码,使其只有一个接受 EventContext 作为参数的 onActivate() 方法。 http://apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/Multiple-onActivate-methods-td2434897.html#a2434901
所以修改后的代码如下。
//在本例中以下方法被调用两次
Object onActivate(EventContext eContext){
int paramCount = eContext.getCount();
if( paramCount == 0 ) return true;
String filterSetJson = eContext.get(String.class, 0);
if( paramCount > 1 ){
int pageCount = eContext.get(Integer.class, 1);
this.pageCount = pageCount;
}
schema = getSchema();
if (ValueHelper.isDefined(filterSetJson) && !filterSetJson.equals("all")) {
setFilterSet( filterSetJson );
}
else {
setFilterSet("{}"); // Empty filter set
}
this.loadedTagSummary = false;
sortOrderForTags="count";
sortOrderForTypes="count";
return true;
}
现在,问题是 onActivate() 仍然被调用两次。一旦参数存在,另一次则没有参数(我认为这次 EventContext 是空的)。因此,我必须添加对参数的检查,如果参数不存在则返回。这避免了整个代码被执行两次,但仍然不是一个干净的修复。我不明白为什么该方法被调用两次。我考虑了一些邮件列表帖子中建议的以下潜在原因。
1:我确信页面上没有图像被指定相对路径。所有图像均加载“上下文”
2:没有父类(super class)实现 onActivate() 方法。它仅存在于此类中。
有趣的是,正如下面链接中所建议的,如果我从两个 onActivate() 方法都返回 true,那么只调用一个方法,问题就解决了! http://apache-tapestry-mailing-list-archives.1045711.n5.nabble.com/T5-onActivate-called-twice-td2428923.html
这是运行良好的代码。
//在这种情况下只调用一个方法。这是正确的行为
Object onActivate(String filterSetJson) {
schema = getSchema();
if (ValueHelper.isDefined(filterSetJson) && !filterSetJson.equals("all")) {
setFilterSet( filterSetJson );
}
else {
setFilterSet("{}"); // Empty filter set
}
this.loadedTagSummary = false;
sortOrderForTags="count";
sortOrderForTypes="count";
return true;
}
Object onActivate(String filterSetJson, int pageCount) {
//onActivate( filterSetJson );
this.pageCount = pageCount;
return true;
}
我可以接受这个解决方案,但我不明白这里发生了什么。任何人都可以阐明为什么两个 onActivate() 方法在不返回 true 时都会被调用,或者为什么 onActivate(EventContext eContext) 被调用两次?
发布此问题的另一个原因是为我自己和其他人记录此问题,因为我在这个问题上花了很多时间。
Tapestry 版本为 5.3
最佳答案
请阅读页面here ,特别是
A good "rule of thumb" is to use onActivate(...) and onPassivate() for no more than receiving and returning the activation context.
您应该小心使用 onActivate
,因为它可能会在您意想不到的时候被调用(例如在渲染 pagelink
时)。您的 onActivate
方法应该是“哑”的,并且仅存储值,仅此而已。将您的逻辑放在另一个事件中(例如 setupRender)。
我似乎还记得 Tapestry 中的一些奇怪的逻辑,它会调用所有 onActivate()
方法,其数量等于或小于 URL 上的页面激活上下文变量的数量。
我要么:
1) 使用单个 onActivate(EventContext)
方法来存储值。将所有逻辑移至 setupRender
。
2)使用@PageActivationContext
和setupRender
@PageActivationContext(index=0)
private String filterSetJson;
@PageActivationContext(index=1)
private Integer pageCount;
void setupRender() {
if (pageCount == null) {
...
} else {
...
}
}
注意:多个@PageActivationContext
是最近的new feature
这两个选项大致相同。
关于Java Tapestry : why is onActivate method called twice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31679881/
如何获取 Assets 目录的 URL,以便在 JavaScript 中使用它来动态加载 Assets ? 背景: 在 Tapestry 5 中, Assets 的路径可以改变以避免缓存问题。该路径取
我希望进入 Tapestry5 的世界。我在 JSF 和 Struts 方面进行了大量开发。有什么好书或教程可以帮助我入门吗? 亲切的问候, 最佳答案 从“getting started”指南开始,然
让我们考虑以下问题。 有一个包含购物篮的页面。篮子是一个包含元素列表的组件,例如水果或汽车等。 页面中有三个篮子:汽车篮、水果篮和全篮。 car-basket 包含汽车,fruit-basket 包含
我的所有页面都有一个布局组件,我想根据用户的需求切换这个组件。我不想为每个页面添加一个属性来返回当前布局组件。 最佳答案 假设您有固定数量的布局,您可以使用块。你的 layout.tml 看起来像:
我一直在使用 Tapestry 的内置组件,但现在我想尝试制作自己的组件。假设这是可能的,那么它是如何完成的?通常是否期望开发人员除了开箱即用的组件之外还创建自己的组件? 最佳答案 是的,开发人员将创
我有一个页面正在显示某些客户端的详细信息。我正在使用t:loop显示一些数据。在t:loop中,我只是传递source和value。到目前为止一切顺利,我的页面工作正常。但是,当我尝试提交Page时,
我需要做出一个由选项 1、2、3 ... 250 组成的选择。 此代码有效,但我希望数字最多为 250! 谢谢,抱歉我的英语不好。 最佳答案 来自select component's docu
当用户 session 过期时,如何更改 Tapestry 4 显示的页面? 最佳答案 啊,过去的日子,Tapestry 4... 我认为有不同的方法.. 只需将要显示的页面命名为“StaleSess
如何覆盖 Apache Tynamo 模板生成的 HTML? 我目前正在转换我的页面以与 Tapestry-bootstrap 一起使用,并且登录表单看起来有点难看。 最佳答案 与其尝试自定义或重用提
我想用 Tapestry5 创建一个子表单: 并像这样使用它: TestComponent.java: import org.apache.tapestry5.
我是 Tapestry 新手。有人可以帮助我解决以下我很难解决的问题吗? 我的页面tags.tml中有一个表单 当提交此表单时,在服务器端java类
我想在 t:grid 组件中显示一个项目列表,但我不知道为什么我得到一个 NP 我 100% 确定我正在重新调整的列表不为空。这是调用访问数据的方法的页面的 java 部分: public class
我已经编写了一个独立的 AngularJS 应用程序,现在正尝试将其集成到 Java Tapestry 框架中。加载所有 JS 工作正常(从 Controller 打印“AngularJS runni
我在使用以下代码时遇到问题: 假设我最终得到以下按钮: 单击任一按钮都只会触发上下文 2504658 的事件 onRemove
在 Tapestry 中刷新页面的方法有哪些?我知道如何使用 AjaxResponseRenderer 刷新区域,但不太确定页面刷新。 任何帮助将非常感激。谢谢。 最佳答案 Tapestry 中没有任
我想指定挂毯网格的默认排序列。 我知道我可以在服务器端的 getter 中对记录进行排序,但这似乎是不必要的努力,因为网格完全能够自行排序。 所以我的网格定义看起来像: getQueues 返回对
我将以下代码用于选择组件: Java类: @Component(parameters = {"blankOption=AUTO", "model=someModel", "value=someId",
我需要自定义 Tapestry 网格列上的标题文本。这段代码就是这样做的,但它删除了排序功能 Custom header 如何恢复此自定义 header 的排序功能? 最佳答案 如果您只需
我的 Tapestry5 应用程序每天使用 jFreeChart 生成动态图像。 我的问题是我不知道如何显示。 我试图将它们保存到 webapp 文件夹中,但似乎不可能,里面没有创建文件。 我尝试了
我想将REST添加到我的挂毯项目中,因此需要知道如何实现它。 有什么更好的方法? 谢谢。 [编辑,从答案中复制:]我必须将GET,PUT,POST和DELETE服务添加到我的挂毯应用程序中。我看到Ta
我是一名优秀的程序员,十分优秀!