展開可能なツリーがあります(HTMLページ内):
+ Category 1
- Category 2
+ Subcategory 1
- Subcategory 2
|- Foo
|- Bar
|- Link 42
これは構造体 (バックエンドで定義) で表されます:
class Demo {
static ImmutableList<Item> sample() {
return ImmutableList.of(
new Item("Category 1", ImmutableList.of(
new Item("Some link title", "resource_id_1"),
new Item("Another link title", "resource_id_2"))),
new Item("Category 2", ImmutableList.of(
new Item("Subategory 1", ImmutableList.of(
new Item("Another link title", "resource_id_3"))),
new Item("Subcategory 2", ImmutableList.of(
new Item("Foo", "resource_id_1"),
new Item("Bar", "resource_id_2"),
new Item("Link 42", "resource_id_42"))))));
}
}
次のようにItem
定義されます。
public class Item {
private String readableName;
private String resourceId;
private ImmutableList<Item> children;
Item(String name, String resourceId) {
this.readableName = name;
this.resourceId = resourceId;
}
Item(String name, ImmutableList<Item> children) {
this.readableName = name;
this.children = children;
}
public String getReadableName() {
return readableName;
}
public String getResourceId() {
return resourceId;
}
public ImmutableList<Item> getChildren() {
return children;
}
}
resourceId
異なる可読な名前を持つことができ、構造全体に複数回配置できますが、現在のカテゴリ/サブカテゴリには 1 回だけ配置できます。
現在、ユーザーがリンクをクリックするかURL を書き込むと、リソースがロードされ (例: リンクFooがマップされ/showResource?id=resource_id_1:uniqe_magic_id
ます)、ツリーが展開されます。ハックのためにのみ機能します-フロントエンドは構造の独自のコピーを作成し、:uniqe_magic_id
各リソースID(各リーフ)に文字列を追加し、リクエストをバックエンドに送信するときにマジック部分をストライプします。:uniqe_magic_id
上記のツリーで適切なアイテムを展開するためにフロントエンドでのみ使用されます。それは私には巧妙な解決策のようです(私はこのコードをリファクタリングし、cleanId
必要ではないと思ったメソッドを削除しましたが、バックエンドにリクエストを送信する前に魔法をストライピングしていました...)、より良い解決策を探しています。
フロントエンドとバックエンドの両方を変更できます。次のようなノードを持つある種のツリーについて考えました。
class Node {
Node next;
Node child;
String readableName;
String resourceId;
String someUniqueHash;
}
と使用しsomeUniqueHash
ます。
フロントエンドで構造全体をコピーせずに同じ結果を達成するより良い方法はありますか?