【问题标题】:Could t:select submit palette values in Tapestry 5.3.6?t:select 能否在 Tapestry 5.3.6 中提交调色板值?
【发布时间】:2026-01-30 01:50:02
【问题描述】:

我有两个值的 t:select - CHANNELS、WIDGETS。如果我选择第一个,我将显示所有通道的调色板并隐藏小部件调色板(都在区域中),如果我选择第二个,我将隐藏通道调色板区域并显示小部件调色板区域。两个调色板都预先选择了从数据库加载的项目。 selectedWidgets, selectedChannels 都被注解为@Persist。问题是客户想要删除选定的小部件,然后切换到渠道并添加它们,所以两个操作。如果他随后保存,已删除的小部件仍然存在,并且频道已正确添加。请问这个可以解决吗?

【问题讨论】:

  • 我还注意到 Persist 保持从数据库加载的状态,而不是实际选择的状态。好的,我已经删除了 Persist 注释,现在唯一的问题是我在通过 select 切换时丢失了所选调色板中的值。
  • just to add, when the select is switched from value to other one, I do ajaxResponseRenderer.addRender() for both zones on the server side

标签: java ajax select tapestry palette


【解决方案1】:

如果我理解正确,您需要在提交表单时保存两个调色板的值。所以两个调色板都应该出现在表单上。

要解决这个问题,您可以隐藏一个调色板并在选择值更改时显示另一个调色板。不需要服务器端操作(也不需要区域):

<t:select t:id="select" .../>
<t:palette id="widgets" .../>
<t:palette id="channels" .../>

和js使用jquery:

var $select = $('#' + selectId);
var $widgets = $('#' + widgetsId);
var $channels = $('#' + channelsId);

$select.on('change', function() {
  if ($select.val() == 1 /* or another value corespondent to channels */) {
    $widgets.hide();
    $channels.show();
  } else {
    $widgets.show();
    $channels.hide();
  }
});

【讨论】:

  • 谢谢苏迪。基本上,我不仅需要在表单提交之后保留值,而且在我使用 select 切换调色板时也需要保留值。这对我不起作用
  • 还是不明白你需要什么。如果您需要在选择值更改后将值保存到数据库,则需要提交表单。或者您可以编写 js,从 url 更新您的区域,并使用从调色板选择的值填充的附加请求参数。
  • 好的,我再解释一下。让我们假设 Persist 被禁用。打开包含上述元素的网页并从 DB 中预加载选定的项目。例如。 2 个频道和 3 个小部件。最初,显示小部件调色板,预选了 3 个项目,选择值为小部件。然后,我添加 2 个小部件并将选择切换到 CHANNELS。发生的情况是:1. 频道是空的,应该有两个 2. 如果我切换回小部件,小部件也是空的
  • 如果我允许@Persist,那么我总是在切换后看到来自 DB 的值,而不是我选择的值
  • 只是添加到我的示例中:2.如果我切换回小部件,小部件也是空的,应该有 5
【解决方案2】:

感谢 sody,我设法解决了这个问题。 第一个主要部分是摆脱区域,只是有一个带有组件的表单并提交一次整个事情,第二个主要部分是在正确的时间触发 sody 提到的 javascript。 如果我有时间,我会粘贴我的 tml、java 和 javascript 代码,我相信有人会帮我清理它。

【讨论】: