6

左パネルと右パネルを持つ body ディレクティブを追加しようとしています。しかし、これらのパネルの間に、body ディレクティブ専用のコンテンツがいくつかあります。現在、transclude=trueオプションを使用してコンテンツをロードしています。しかし、2 つの ng-transclude を使用する方法を探しています。それを解決する方法をたくさん調べましたが、エレガントな解決策を見つけることができませんでした。body ディレクティブのコンパイル手順で、トランスクルードされたオブジェクトを手動で追加する必要がありました。以下は私がそれを解決した方法です:

ボディ ディレクティブ

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

myApp.directive('body', function () {
    return {
        restrict: 'A',
        transclude: true,
        scope: {
            title: '@'
        },
        templateUrl: 'body.html',
        compile: function compile(element, attrs, transclude) {
            return function (scope) {
                transclude(scope.$parent, function (clone) {
                    for (var i = 0; i < clone.length; i++){ 
                       var el = $(clone[i]);
                       if(el.attr('panel-left') !== undefined) {
                            element.find('#firstPanel').html(el);
                       } else if(el.attr('panel-right') !== undefined) {
                            element.find('#secondPanel').html(el);
                       }
                    }
                });
            }
        }
    };
});

myApp.directive('panelLeft', function () {
    return {
        require: "^body",
        restrict: 'A',
        transclude: true,
        replace: true,
        template: '<div ng-transclude></div>'
    };
});

myApp.directive('panelRight', function () {
    return {
        require: "^body",
        restrict: 'A',
        transclude: true,
        replace: true,
        template: '<div ng-transclude></div>'
    };
});

テンプレート

<script type="text/ng-template" id="body.html">
    <h1> {{title}} </h1>
    <hr/>

    <div id="firstPanel" class="inner-panel"></div>
    <div id="innerMiddleContent" class="inner-panel">middle private content here</div>
    <div id="secondPanel" class="inner-panel"></div>
</script>

<div body title="Sample Body Directive">
    <div panel-left>
        Public content that goes on the left
    </div>   

    <div panel-right>
        Public content that goes on the right
    </div>    
</div>

この例の JSFiddle は次のとおりです。私はこのようなものを探しています:

あると便利なテンプレート

 <script type="text/ng-template" id="body.html">
     <h1> {{title}} </h1>
     <hr/>

     <div id="firstPanel" class="inner-panel" ng-transclude="panel-left"></div>
     <div id="innerMiddleContent" class="inner-panel">middle private content here</div>
     <div id="secondPanel" class="inner-panel" ng-transclude="panel-right"></div>
 </script>

質問: 私は何か間違ったことをしていますか? この問題を解決するための推奨される方法はありますか?

4

2 に答える 2

3

この指令を見たことがありますか?

https://github.com/zachsnow/ng-multi-transclude

これはまさにあなたが探しているものだと思います。

したがって、テンプレートにわずかな変更を加えて

<div ng-multi-transclude="panel-left" class="inner-panel"></div>
<div ng-multi-transclude="panel-right" class="inner-panel">middle private content here</div>
<div id="secondPanel" class="inner-panel"></div>

そして、あなたはそれをこのように使うことができます

<div body title="Sample Body Directive">
  <div name="panel-left">
    Public content that goes on the left
  </div>   

  <div name="panel-right">
    Public content that goes on the right
  </div>    
</div>
于 2015-01-27T01:53:03.463 に答える
2

Angular 1.5 の時点で、サードパーティ ライブラリなしで複数のトランスクルージョンがサポートされています。

これは「スロット」トランスクルージョンと呼ばれtransclude、ディレクティブのプロパティにオブジェクトを提供することでスロットを指定します。

directive('someDirective', {
  template: '<div ng-transclude="first"></div><div ng-transclude="second"></div>'
  transclude: {
    first: '?elementOne', // Question mark makes it optional
    second: 'elementTwo'
  },
...
}

そして、あなたが使用するときsomeDirective

<some-directive>
  <element-one><!-- content to tranclude into first slot --></element-one>
  <element-two><!-- content to tranclude into second slot --></element-two>
</some-directive>

追加の資料と例

ngTransclude のドキュメント

Angular 1.5 の複数のトランスクルージョン スロットの使用

于 2016-12-29T19:41:43.140 に答える