【发布时间】:2017-07-03 12:11:50
【问题描述】:
我想在 Angular 中渲染一个多列树(即树表或树网格)。我的数据是任意深度的树,看起来像这样:
[
{name: "node 1",
type: "folder",
children: {[
{name:"node 1-1", type:file},
{name:"node 1-2", type:file},
{name:"node 1-3", type:file},
]}
},
...
...
]
我见过使用递归模板在 ul/li 树中呈现它的示例,但我需要多个列,所以我认为我需要一个表。到目前为止,我提出的用于呈现上述数据结构的最佳 HTML 如下所示:
<tr>
<td>
node 1
</td>
<td>
folder
</td>
</tr>
<tr>
<td>
<span class="treetable-padding"/>
node 1-1
</td>
<td>
file
</td>
</tr>
...
...
因此,换句话说,它只是一个平面表,其中树的深度使用多个 span 元素表示,该数字等于层次结构中的那个级别。
一般来说,我对 html/AngularJS/js 不是很好,所以我不知道这是否是呈现我的数据的最佳方式,但它看起来确实是我想要的方式。
我的问题是,使用 AngularJS 的最佳方法是什么?我知道我可以在 JavaScript 中构建一个像这样的整体 html 块,然后将其包装在自定义指令中,但我正在寻找一种更符合 Angular 精神的解决方案,以便我可以利用数据绑定等。我最终希望单元格是可编辑的,所以我不想做任何会使数据绑定混乱的事情。
我想编写一些代码来将我的树扁平化为明确包含“深度”属性的对象列表。那么也许我可以使用 ng-repeat。但我认为也许有一种使用一个或多个自定义指令的更清洁的方法
谢谢!
【问题讨论】:
-
有什么理由需要这张桌子吗?您可以尝试扩展像 angular-json-tree 这样的指令以允许编辑
-
我需要多列。为简洁起见,我没有在示例中展示它们。
-
您希望通过额外的列实现什么目标? :) 用于编辑/删除/复制的按钮?如果是这样,您可能可以使用 ui-popover 或模态来管理相同的操作
-
我希望其他列始终可见,例如 maxazan.github.io/jquery-treegrid。我将使用它们进行编辑/删除等,但那里也会显示数据。
-
在思考/阅读了更多之后,我现在想我有一个如何做到这一点的计划。我需要的是像 ng-repeat 这样的自定义转发器,但不同之处在于它将递归地遵循“item in items”表达式,并构建一个平面表,其中每一行都包含一个“depth”属性。然后希望我可以使用嵌套在每一行中的另一个线性中继器,它使用深度属性来创建用于填充的跨度。在我真正完成它之前,我还有一些学习要做......
标签: recursion angularjs-directive flatten treetable