在Tapestry中我有一种情况,我将用户从页面A重定向到页面B,有时在显示页面B之前,他被重定向到页面C.这导致以下javascript异常显示为红色弹出窗口,如页面上出现的那样:
Exception invoking function Tapestry.Initializer.activate with parameters ["example"]: TypeError: $(...) is null
列为null的所有元素都来自Page B,我不想或不想显示。在这种情况下,我无法直接将用户从页面A重定向到页面C.
我需要在tapestry中使用一种方法来自己处理这些javascript异常,或者将它们隐藏起来,或者使用适当的挂毯技术在页面之间重定向而不会出现这些错误。目前我正在通过从@AfterRender函数启动重定向代码来模拟用户移动的低谷页面。
编辑:我已添加以下代码的相关部分
在用户点击修改后的第一页上,我将其重定向到用户页面
@InjectPage
UserDataPage userDataPage;
@OnEvent(value = EventConstants.ACTION, component = "modify")
Object onModify(Long userToEdit) {
userDataPage.setUserId(userToEdit);
userDataPage.setEditDetails(true);
return userDataPage;
}
由于我真的需要编辑细节,UserDataPage执行此操作:
@InjectPage
UserDetailsPage userDetailsPage;
@AfterRender
Object setup() {
if(editDetails) {
userDetailsPage.setUserId(userToEdit);
return userDetailsPage;
}
}
当UserDetailsPage加载时,它会显示有关UserDataPage中缺少的组件的错误(显然,因为我不再使用UserDataPage)。在Firebug中,我看到脚本包含UserDataPage和UserDetailsPage中的所有元素。例如,我在两个页面上都有网格元素,因此生成的tapestry脚本既指向网格又自动重命名为grid_0。然后错误抱怨UserDataPage中缺少网格。
我不能直接从用户列表(第一页)到UserDetailsPage,因为UserDetailsPage要求重定向来自UserDataPage。我不被允许摆脱这个要求。
答案 0 :(得分:0)
在页面之间重定向的正确挂毯方式是从事件处理程序返回页面类,页面名称或链接。
public Object onActionFromMyLink() {
return MyPage.class;
}
要隐藏tapestry客户端错误,您可以覆盖javascript函数Tapestry.error
。
Tapestry.error = function() {
console.log(...);
}
但我认为问题出在您的代码中。
<强> UPD 强>:
在挂毯中进行导航的最佳方法是使用page activation context
答案 1 :(得分:0)
如果PageA重定向到PageB然后PageB重定向到PageC,我认为PageB渲染(或引起任何javascript异常)的可能性不大。 PageB只会返回302 redirect响应,浏览器将直接返回PageC。
我猜测PageC缺少onPassivate()方法(或等效的@PageActivationContext注释),并且您的激活上下文在请求之间丢失。
http://jumpstart.doublenegative.com.au/jumpstart/examples/navigation/onactivateandonpassivate/3 http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/annotations/PageActivationContext.html