0

在 Tapestry 中,我有一种情况,我将用户从页面 A 重定向到页面 B,有时他在显示页面 B 之前被重定向到页面 C。这会导致以下 javascript 异常显示为页面上出现的红色弹出窗口,如下所示:

Exception invoking function Tapestry.Initializer.activate with parameters ["example"]: TypeError: $(...) is null

列为 null 的所有元素都来自页面 B,我不想或不打算显示。在这种情况下,我无法直接将用户从页面 A 重定向到页面 C。

我需要一种在挂毯中自己处理这些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 的所有元素。例如,我在两个页面上都有网格元素,因此生成的挂毯脚本同时引用网格并自动重命名为 grid_0。然后错误抱怨 UserDataPage 缺少网格。

我不能直接从用户列表(第一页)转到 UserDetailsPage,因为 UserDetailsPage 要求重定向来自 UserDataPage。我不能摆脱这个要求。

4

2 回答 2

0

在页面之间重定向的正确挂毯方式是通过从事件处理程序返回页面类、页面名称或链接。

public Object onActionFromMyLink() {
  return MyPage.class;
}

要隐藏 Tapestry 客户端错误,您可以覆盖 javascript 函数Tapestry.error

Tapestry.error = function() {
  console.log(...);
}

但我认为问题出在您的代码中。

更新

在 Tapestry 中进行导航的最佳方法是使用页面激活上下文

于 2013-08-12T18:34:33.613 回答
0

在 PageA 重定向到 PageB 然后 PageB 重定向到 PageC 的情况下,我认为 PageB 不可能呈现(或导致任何 javascript 异常)。PageB 将简单地返回302 重定向响应,浏览器将直接转到 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

于 2013-08-14T08:43:22.947 回答