2

angularjs に 2 つのディレクティブを記述しました。1 つはもう 1 つのディレクティブに埋め込まれています。

以下は、ディレクティブのスクリプトです。

module.directive('foo', [
   '$log', function($log) {
     return {
      restrict: 'E',
      replace: true,
      transclude: true,
      template: '<div id="test" ng-transclude></div>',
      controller: function($scope) {
        this.scope = $scope;
        return $scope.panes = [];
      },
      link: function(scope, element, attrs) {
        return $log.log('test1', scope.panes);
      }
    };
  }
]);

module.directive('bar', [
  '$log', function($log) {
    return {
      restrict: 'E',
      replace: true,
      transclude: true,
      require: '^?foo',
      controller: function($scope) {
        return this.x = 1;
      },
      template: '<div ng-transclude></div>',
      link: function(scope, element, attrs, fooCtrl) {
        return $log.log('test2', fooCtrl);
      }
    };
  }
]);

以下はhtmlの一部です:

<foo ng-controller="IndexController">
      <bar></bar>
    </foo>

以下は、クロム開発者ツールから検査され、生成された要素です

<div id="test" ng-transclude="" ng-controller="IndexController" class="ng-scope">
      <div ng-transclude="" class="ng-scope"></div>
    </div>

以下はクロムコンソール出力です:

test2 
Array[0]
length: 0
__proto__: Array[0]
 angular.js:5930
test1 
Array[0]
length: 0
__proto__: Array[0]  

質問: 子ディレクティブが親ディレクティブのコントローラーを取得できないため、「bar」のリンク関数の 4 番目のパラメーター「fooCtrl」が空の配列になっています。私が間違っていることは何ですか?

更新して答えてください:

最後に、奇妙な結果をもたらした理由を見つけました。それは私が犯したばかげた間違いです:

 // in directive "foo"
 controller: function($scope) {
    this.scope = $scope;
    // This line below is wrong. It is here 
    // because I transcompiled coffeescript to js.
    // return $scope.panes = [];
    // It should be like below:
    $scope.panes = []
    // I should have written .coffee like below
    // controller: ($scope) ->
    //     @scope = $scope
    //     $scope.panes = []
    //     return # prevent coffeescript returning the above expressions.
    //     # I should rather have added the above line
  }

間違いを修正した後、試してみたところ、コントローラーの使用や子ディレクティブでの空のコンテンツの提供を妨げるものは何もないことがわかりました。

4

1 に答える 1

2

私の知る限り、子ディレクティブにコントローラーを含めることはできません。

デモ: http://plnkr.co/edit/kv9udk4eB5B2y8SBLGQd?p=preview

app.directive('foo', [
   '$log', function($log) {
     return {
      restrict: 'E',
      replace: true,
      transclude: true,
      template: '<div id="test" ng-transclude></div>',
      controller: function($scope) {
        $scope.panes = ['Item1','Item2','Item3'] 
        return { 
          getPanes: function() { return $scope.panes; }
        };
      },
      link: function(scope, element, attrs, ctrl) {
        $log.log('test1', ctrl, ctrl.getPanes(), scope.panes);  
      }
    };
  }
]);

子コントローラーを削除しました。

app.directive('bar', [
  '$log', function($log) {
    return {
      restrict: 'E',
      replace: true,
      transclude: true,
      require: '^?foo',
      template: '<div ng-transclude></div>',
      link: function(scope, element, attrs, ctrl) {
        scope.x = 1;
        $log.log('test2', ctrl, ctrl.getPanes(), scope.panes, scope.x);
      }
    };
  }
]);
于 2013-10-09T03:12:11.297 に答える