我正试图弄清楚如何使用动态的、客户端驱动的"上下文"来更新挂毯区域。我对挂毯还很陌生,目前我还停留在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;