 小さなWebプロジェクトで作業するプロセスでは、ページに要素のツリーを表示するコンポーネントが必要でした。 このコンポーネントでは、ツリーノードの展開/折りたたみ、要素のクリックの処理、ツリーへの新しいノードの追加、一般的な最も基本的なツリービュー機能の提供が可能です。
 小さなWebプロジェクトで作業するプロセスでは、ページに要素のツリーを表示するコンポーネントが必要でした。 このコンポーネントでは、ツリーノードの展開/折りたたみ、要素のクリックの処理、ツリーへの新しいノードの追加、一般的な最も基本的なツリービュー機能の提供が可能です。 
      コンポーネントを使用するための条件は、「一般に受け入れられている」ものとは多少異なります。最新の(IE9 +)ブラウザーがランタイム環境として使用されます(Webプロジェクトは完全に制御された内部ネットワーク内で使用されることになっています)。 もう1つのポイントは、サーバー部分の開発に基づいたプラットフォームです。 これはASP.NET MVCです。つまり、ASP.NET MVCアプリケーションの一般的なディレクトリ構造に適したNuGetパッケージとしてコンポーネントを配信することが望ましいということです。
この問題に取り組む過程で、既存のオプションを研究し、いつものように、
この記事の執筆時点では、インターネット上で、要素のツリーを表示するための最も一般的な6つのコンポーネントを見つけることができます。
- jsTree 。 昨年のhabrahabrでのjsTree の議論から判断すると、一部の開発者はDynatreeを好んでいます。
- jqTree 。 それは最も楽しい印象を与えます。 おそらく、優れた設計と詳細なドキュメントが原因です。
- jQuery TreeViewプラグイン 。 著者は、プロジェクトがもはや積極的に開発されていないと報告し、jqTreeの使用を推奨しています。
- ダイナツリー
- dhtmlxTree 。
- dTree 。
いくつかの結論。
- すべては、古い顧客をサポートするための間接費によって特徴付けられます。
- 最初の4つは動作するためにjqueryを必要とします。 5番目はフレームワークを使用します。 後者だけが自給自足です。
- さらに、後者は比較的古い「恐竜」(2003)であり、zipアーカイブの形式でのみ利用可能です。
- 最初の4つだけがパブリックバージョン管理を持っています。 同時に、最初の3つのリポジトリのみがGitHubに投稿されます。 DynatreeリポジトリはGoogle Codeにあります。 どうやら、Dynatreeは既にGitHubにあるFancytreeプロジェクトに進化していることに注意してください。
- どのプロジェクトにもNuGetパッケージは含まれていません。
長所と短所を比較検討した後、ASP.NET MVCおよびVisual Studio 2012に基づく最もシンプルで使いやすい標準アプリケーションテンプレートを、古いブラウザーをサポートする負担なしに、独自の自転車を発明することにしました。 自転車が発明されました。 その際立った特徴は次のとおりです。
- TypeScriptとLESSに基づく実装
- Compositeテンプレートに従ってツリー情報モデルを操作します。
CSSルールを分離するには、単純ですが、私の意見では、最も正しいアプローチが使用されます。
- 名前空間に対応するクラス名がツリーのコンテナ要素に追加されます。
- コンポーネントのすべてのCSSルールのセレクターはcontext- childであり、前の段落のクラスが唯一の必須ルート親として指定されます。
| 少ない | CSS | 
|---|---|
|  |   | 
Tree
      
      は3つのパブリックメンバーがあります。
-   updateNode(...)
 
 
 
 メソッドは、指定されたノードに要素を追加します。
-   onBranchExpand
 
 
 
 およびonNodeClick
 
 
 
 は、対応するイベントのハンドラーを指定するために使用されます。
renderNodeItemsTo(...)
      
      および
toggleNodeItemsVisible(...)
      
      は基本的なロジックを実装します。 ツリー要素の可視性の変更は、DOM要素を追加/削除することで実装されます(
Element.removeChild(...)
      
      - jsperfを使用して削除します )。
toggleNodeItemsVisible(...)
      
      メソッドは、指定されたツリーノード(JSオブジェクト)に要素がない場合、
false
      
      返します。 これにより、
onBranchExpand
      
      ハンドラーを呼び出す条件はかなり簡潔になります。
 if(!this.toggleNodeItemsVisible(node) && (this.onBranchExpand instanceof Function)) { this.onBranchExpand(nodeId); }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      特に、コンポーネントの実装時にTypeScript + LESSを使用すると、プロジェクトでの使用と、ニーズに合わせた改良が大幅に簡素化されます。
GitHub-github.com/resnyanskiy/js.tree
NuGet-nuget.org/packages/resnyanskiy.js.tree