2016-03-21 14 views
2

ディレクティブが必要な私のアプリケーションで問題が発生しています。そのテンプレートの中に、同じディレクティブを再帰的にレンダリングするかどうかを条件付きで決定する必要があります。私はそれを作り直そうとしましたが、この例もうまくいきません。ディレクティブはレンダリングされず、エラーもありません。私はそれで別のミスをしたかもしれません。angularjsディレクティブを再帰的にネストする

https://plnkr.co/edit/PhDvLZyWvyFThg57qZDV?p=preview

index.htmlを

<!DOCTYPE html> 
<html> 

    <head> 
    <script data-require="[email protected]" data-semver="1.5.0" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0/angular.js"></script> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="script.js"></script> 
    </head> 

    <body ng-app="app" ng-controller="MainCtrl"> 
    <ul class="nav navbar-nav"> 
     <li ng-repeat="menu in menus"> 
     <button class="btn btn-default dropdown-toggle" type="button"> 
      <span ng-bind="menu.Text"></span> 
      <span class="caret"></span> 
     </button> 
     <ul class="dropdown-menu" role="menu"> 
      <li menu-entry menus="menu.SubMenus"></li> 
     </ul> 
     </li> 
    </ul> 
    </body> 

</html> 

メニュー-entry.html

<li ng-repeat="menu in menus"> 
    <a ng-if="menu.Submenus.length===0" ng-bind="menu.Text"></a> 
    <button ng-if="menu.Submenus.length>0" type="button" ng-bind="menu.Text"> 
     <span class="caret caret-right"></span> 
    </button> 
    <ul ng-if="menu.Submenus.length>0" class="dropdown-menu" role="menu"> 
     <li menu-entry menus="menu.SubMenus"></li> 
    </ul> 
</li> 

script.js

var app = angular.module('app', []); 

app.controller('MainCtrl', function($scope) { 
    $scope.menus = [ 
    { Text: '1', SubMenus: [ 
     { Text: '1.1', SubMenus: [{Text:'1.1.1',SubMenus:[]},{Text:'1.1.2',SubMenus:[]},{Text:'1.1.3',SubMenus:[]}]}, 
     { Text: '1.2', SubMenus: [{Text:'1.2.1',SubMenus:[]},{Text:'1.2.2',SubMenus:[]},{Text:'1.2.3',SubMenus:[]}]}, 
     { Text: '1.3', SubMenus: [{Text:'1.3.1',SubMenus:[]},{Text:'1.3.2',SubMenus:[]},{Text:'1.3.3',SubMenus:[]}]} 
     ]}, 
    { Text: '2', SubMenus: [ 
    { Text: '2.1', SubMenus: [{Text:'2.1.1',SubMenus:[]},{Text:'2.1.2',SubMenus:[]},{Text:'2.1.3',SubMenus:[]}]}, 
    { Text: '2.2', SubMenus: [{Text:'2.2.1',SubMenus:[]},{Text:'2.2.2',SubMenus:[]},{Text:'2.2.3',SubMenus:[]}]}, 
    { Text: '2.3', SubMenus: [{Text:'2.3.1',SubMenus:[]},{Text:'2.3.2',SubMenus:[]},{Text:'2.3.3',SubMenus:[]}]} 
    ]}, 
    ]; 
}); 

app.directive('menuEntry', function() { 
     var cFn = ['$scope', function ($scope) { 

     }]; 

     var lFn = function (scope, element, attr, ctrl, transclude) { 
     }; 

     return { 
      restrict: 'A', 
      replace: true, 
      templateUrl: 'menu-entry.html', 
      controller: cFn, 
      link: lFn, 
      scope: { 
       menus: '=' 
      } 
     }; 
}); 

答えて

2

現在、現在のディレクティブの実装には3つの問題があります。

  • 問題は、あなたが再びulを持つつのテンプレートを追加してreplace: trueli要素に指示していたです。結果として得られたhtmlは、フォーマットが正しくありませんでした。ululの内部にはもう一度入りません。あなたはreplace: false ** ORにreplace: trueをディレクティブちょうどそのオプションを削除してください。そこ**
  • あなたのディレクティブのテンプレートmenu.Submenus変更はmenu.SubMenus

テンプレート

<li ng-repeat="menu in menus"> 
    {{menu.Text}} 
    <a ng-if="menu.SubMenus.length == 0" ng-bind="menu.Text"></a> 
    <button ng-if="menu.Submenus.length>0" type="button" ng-bind="menu.Text"> 
     <span class="caret caret-right"></span> 
    </button> 
    <ul ng-if="menu.SubMenus.length>0" class="dropdown-menu" role="menu"> 
     <li menu-entry menus="menu.SubMenus"></li> 
    </ul> 
</li> 

Demo Plunkr

+0

ねえ。返信いただきありがとうございます。ただし、再帰メニューはレンダリングされません。 1.1.1,1.2.1,1.3.1などありません。 – tic

+1

@tic multiple typos ..更新された回答をご覧ください。 –

+0

非常に高く評価されています。実際のプログラムで何が間違っていたかを知る必要があるかどうかを知る必要があります。これは、 'SubMenus'への更新が少なくとも動作していることが分かります。 'length'は私の元のコードでは正しかった、' replace:true'が働いていれば、あなたは李の中に李を持っているかもしれません。 – tic

1
する必要があります

問題はtypoです: サブメヌス - > SubMenus

script.jsオブジェクトでSubMenusで定義されていますが、テンプレート内でサブメニューを参照しています。

+0

ありがとう。時々それは小さい愚かな事である – tic

+1

答えをもう一度加える必要はない。 –

関連する問題