使用动态上下文更新挂毯区域



我正试图弄清楚如何使用动态的、客户端驱动的"上下文"来更新挂毯区域。我对挂毯还很陌生,目前我还停留在5.0版本。

这样做的主要原因是重用另一个挂毯组件作为jquery对话框的子组件,而不必重写挂毯组件。

一个问题是,该区域以及控制它的任何元素最终都会出现在jquery对话框中$jquery(…).dailog()倾向于将元素的html剪切/粘贴到另一个位置,这可能会破坏某些内容。然而,即使在jquery对话框之外,我也无法使事情正常工作。

以下是我尝试过的,但似乎没有奏效(也许我做错了):

  • 创建绑定到区域的事件链接,并修改href。Tapestry似乎使用了存储在某个地方的变量,而不是叹息
  • 创建一个绑定到区域的t:form。当我尝试更新它时,我可以判断出服务器端事件正在发生,但挂毯区域并没有像它应该的那样改变或更新。区域位于外部,与表单分离。当区域更新时,我甚至看不到典型的黄色闪光

我发现一些示例代码基本上解决了我的问题;它一直不起作用,但当我在SO上输入问题时,我发现了问题所在。由于很可能其他人也遇到了这个问题,我在这里发布了一个答案:

        var zoneId = "itemZone"; // tml was <t:zone id="itemZone"...>
        var zoneObject = Tapestry.findZoneManagerForZone(zoneId);
        zoneObject.updateFromURL(url);

为了解决jquery.dialog()移动html的问题,我还必须复制并保留区域管理器,如下所示:(其中$J(…)是我对jquery的缩写,以避免原型冲突)

    prototypeStorageObj = $T("itemZone");
    zoneManager = prototypeStorageObj.zoneManager;
    // jquery stuff that kills the prototype data storage.
    emailForm = $J("#myDialog");
    emailForm.dialog({ autoOpen: false, modal:true });
    emailForm.dialog('open');
    // restore the zone manager so the zone works again:
    $T("itemZone").zoneManager = zoneManager;

最新更新