13

リストを使用してツリーを表示する必要がある Web アプリを構築しています。私の基本的な構造は次のようになります。

* Node 1
    * Node 1.1
        * Node 1.1.1
            * Node 1.1.1.1
        * Node 1.1.2
    * Node 1.2

http://jsfiddle.net/QffFm/1/

私は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);
        }
    }
    };
});
4

1 に答える 1

32

次の例では、次を使用しました。

  • ブートストラップ
  • AngularJS 再帰的ng-includeまたは(2 番目の例を参照)再帰的ディレクティブ
  • jQuery (将来的には回避しようとします)

デモ1 ( ng-include)Plunker

ここに画像の説明を入力

このモデルから:

 $scope.displayTree =
            [{
            "name": "Root",
            "type_name": "Node",
            "show": true,
            "nodes": [{
                "name": "Loose",
                "group_name": "Node-1",
                "show": true,
                "nodes": [{
                    "name": "Node-1-1",
                    "device_name": "Node-1-1",
                    "show": true,
                    "nodes": []
                }, {
                    "name": "Node-1-2",
                    "device_name": "Node-1-2",
                    "show": true,
                    "nodes": []
                }, {
                    "name": "Node-1-3",
                    "device_name": "Node-1-3",
                    "show": true,
                    "nodes": []
                }]
            }, {
                "name": "God",
                "group_name": "Node-2",
                "show": true,
                "nodes": [{
                    "name": "Vadar",
                    "device_name": "Node-2-1",
                    "show": true,
                    "nodes": []
                }]
            }, {
                "name": "Borg",
                "group_name": "Node-3",
                "show": true,
                "nodes": []
            }, {
                "name": "Fess",
                "group_name": "Node-4",
                "show": true,
                "nodes": []
            }]
        }];
        [{
            "name": "Android",
            "type_name": "Android",
            "icon": "icon-android icon-3",
            "show": true,
            "nodes": []
        }];
    }

2 番目の例は、2 つのディレクティブに基づいています。

app.directive('nodeTree', function() {
      return {
        template: '<node ng-repeat="node in tree"></node>',
        replace: true,
        transclude: true,
        restrict: 'E',
        scope: {
          tree: '=ngModel'
        }
      };
});

app.directive('node', function($compile) {
  return { 
    restrict: 'E',
    replace:true,
     templateUrl: 'the-tree.html',
    link: function(scope, elm, attrs) {
    
      // ....     
     
      if (scope.node.children.length > 0) {
        var childNode = $compile('<ul ><node-tree ng-model="node.children"></node-tree></ul>')(scope)
        elm.append(childNode);
      }
    }
  };
}); 

(いくつかのチェックボックスも追加しました:))

デモ 2Plunker

見た目:

ここに画像の説明を入力

于 2013-10-30T20:04:37.490 に答える