18

複合リスト ディレクティブがあります。つまり、それ自体がリストになるリスト項目です。
親ディレクティブはコントローラーを定義します。

.directive('parent', function() {
    controller: function($scope) {
    },
    link: function (scope, element, attrs) {
    }
})

(項目の) リストには、それ自体で正常に動作する親コントローラーが必要です (なぜそうすべきではないのか..):

.directive('list', function() {
     require: '^parent',
     link: function (scope, element, attrs, parentCtrl) {
     }
  })

同じことが具体的なアイテムにも当てはまります。これも問題ありません。

.directive('item', function() {
    require: '^parent',
    link: function (scope, element, attrs, parentCtrl) {
    }
})

アイテムは、それ自体が「リスト」を作成する複合体である場合があります。この構成は、リンク関数内のリスト項目を$compile (ing) することによって行われます。

link: function (scope, element, attrs, parentCtrl) {
      ...
      $compile("<list></list>")(scope)
      ... 
}

これは例外をスローします:
ディレクティブ 'list' で必要なコントローラー 'parent' が見つかりません!

この理由は明らかです。$compile 関数がコントローラーを提供していないため、'parent' の要件を解決できません。
それで、コントローラーを手動で提供しようとしました:

$compile("<list></list>")(scope, null, {'parent': parentCtrl});

これは例外をスローしませんが、必要なときにこのコントローラーを提供しません。

$compile 関数に、同様に評価する必要がある外部コントローラーを受け入れるようにする方法はありますか?

4

3 に答える 3

23

同様の問題が発生しましたが、解決策は、最初に要素を親に追加してからコンパイルすることです。

.directive('item', function($compile) {
  return {
    template:'<li><a ng-click="addSubList()">Create Another List</a></li>',
    require: '^parent',
    replace: true,
    link: function(scope, element, attrs, parentCtrl) {

      scope.addSubList = function() {
        var sublist = angular.element('<ul list>');
        element.find('a').append(sublist);
        $compile(sublist)(scope);
      };

    }
  };
});

このプランカーを参照してください: http://plnkr.co/edit/dASASrFbtXSMCRZKRAj5?p=preview

于 2014-03-22T21:33:32.197 に答える
-3
$compile(angular.element("< list>< /list >"))(scope)
于 2016-04-14T09:06:35.217 に答える