Tapestry5 では、ツリー コンポーネントにより、ユーザーは複数のアイテムを選択できます。選択された各アイテムは太字で表示されます。ツリー コンポーネントを制限して、1 つのアイテムを選択できるようにするにはどうすればよいですか?
この目的のために TreeSelectionModel をチェックしてきましたが、できることはコレクションに TreeNode 値を格納することだけで、クライアント側でユーザーの選択を制限することはできません。
ありがとう。
Tapestry5 では、ツリー コンポーネントにより、ユーザーは複数のアイテムを選択できます。選択された各アイテムは太字で表示されます。ツリー コンポーネントを制限して、1 つのアイテムを選択できるようにするにはどうすればよいですか?
この目的のために TreeSelectionModel をチェックしてきましたが、できることはコレクションに TreeNode 値を格納することだけで、クライアント側でユーザーの選択を制限することはできません。
ありがとう。
That's a tricky one. You have to place the tree component within a zone and update the zone when the selection changes.
Geoff Callender posted an example at jumpstart: http://jumpstart.doublenegative.com.au/jumpstart/examples/ajax/treefromdatabasewithzones
Psydo-code example:
Tml:
<t:zone t:id="treeZone" id="treeZone">
<t:tree t:id="Tree" t:model="treeModel" t:node="treeNode" t:value="categoryNode" class="prop:leafClass">
<p:label>
<t:if test="treeNode.leaf">
<a t:type="EventLink" t:event="leafSelected" t:context="categoryNode.category.id" t:zone="selectedZone" href="#">
${treeNode.label}
</a>
</t:if>
<t:if test="!treeNode.leaf">
${treeNode.label}
</t:if>
</p:label>
</t:tree>
</t:zone>
Java:
@InjectComponent
private Zone treeZone;
@Inject
private AjaxResponseRenderer ajaxResponseRenderer;
@Inject
private Request request;
void onLeafSelected(Integer categoryId) {
CategoryNode categoryNode = categoryService.findCategoryInfo(categoryId);
selectedCategory = categoryNode.getCategory();
if (request.isXHR()) {
ajaxResponseRenderer.addRender(treeZone).addRender(selectedZone);
}
}
public String getLeafClass() {
if (selectedCategory != null && categoryNode.getCategory().equals(selectedCategory)) {
return "selected";
}
else {
return "";
}
}