リストを使用してツリーを表示する必要がある Web アプリを構築しています。私の基本的な構造は次のようになります。
* Node 1
* Node 1.1
* Node 1.1.1
* Node 1.1.1.1
* Node 1.1.2
* Node 1.2
私はAngularまたはBootstrapで次のように使用できるものを見つけようとしています:
- リストの最初のビューでは、3 番目のレイヤーまで展開されます。私のフィドルでは、ノード 1、ノード 1.1、ノード 1.1.1、ノード 1.1.2、およびノード 1.2 を見たいと思います (第 4 層 - ノード 1.1.1.1 を除くすべて)。
- リスト スタイルのアイコン (ノードの単語名ではない) をクリックすると、ノードが折りたたまれたり展開されたりします。
- 理想的には、アイテムが展開されているかどうかによってもアイコンが変化することを望みます。下にさらにある場合は右矢印、既に展開されている場合は下矢印、子がない場合は通常のリスト項目
私はAngularJSに非常に慣れておらず、Bootstrapにもまだまったく慣れていません。Angular にはアコーディオン関数があり、必要なすべてを処理していないようです。
さまざまなケースを処理する Web アプリに多くのロジックをコーディングする前に、最善のアプローチについて何らかの方向性を示したいと思います。これはよくある問題だと思うので、私が利用できる既製のものがあるかもしれません。どんなガイダンスでも大歓迎です。
HTML コード:
<div ng-app="myApp" ng-controller="controller">
<my-directive></my-directive>
<table style="width: 100%"><tbody><td>
<tree items="tree"></tree>
</td></tbody></table>
</div>
角度コード:
var app = angular.module('myApp', []);
app.controller('controller', function ($scope){
$scope.tree=[{"name":"Node 1","items":[{"name":"Node 1.1","items":[{"name":"Node 1.1.1","items":[{"name":"Node 1.1.1.1","items":[]}]},{"name":"Node 1.1.2","items":[]}]},{"name":"Node 1.2","items":[]}]}];
});
app.directive('tree', function() {
return {
template: '<ul><tree-node ng-repeat="item in items"></tree-node></ul>',
restrict: 'E',
replace: true,
scope: {
items: '=items',
}
};
});
app.directive('treeNode', function($compile) {
return {
restrict: 'E',
template: '<li >{{item.name}}</li>',
link: function(scope, elm, attrs) {
if (scope.item.items.length > 0) {
var children = $compile('<tree items="item.items"></tree>')(scope);
elm.append(children);
}
}
};
});