2014-01-13 15 views
33

テンプレート要素全体ではなく、要素をng-transcludeに置き換えることは可能ですか?要素をng-transcludeに置き換える方法

HTML:

<div my-transcluded-directive> 
    <div>{{someData}}</div> 
</div> 

指令:

return { restrict:'A', templateUrl:'templates/my-transcluded-directive.html', transclude:true, link:function(scope,element,attrs) { } }; 

私-トランスクルード-directive.html:私は何

<div> 
    <div ng-transclude></div> 
    <div>I will not be touched.</div> 
</div> 

お探しの方は<div>{{someData}}</div><div ng-transclude></div>に置き換えてください。現在起こっているのは、ng-transclude div要素の内側に配置されていることです。

これは可能ですか?

答えて

37

私は最高の解決策はおそらく、これを処理する独自のtransclude-replace指示を作成することだと思います。しかし、あなたの例に迅速かつ汚いソリューションのためのあなたは、本質的に手動であなたが望むトランスクルーの結果を置くことができます:

私-トランスクルード-directive.html:

<div> 
    <span>I WILL BE REPLACED</span> 
    <div>I will not be touched.</div> 
</div> 

指令:

return { 
    restrict:'A', 
    templateUrl:'templates/my-transcluded-directive.html', 
    transclude:true, 
    link:function(scope,element,attrs,ctrl, transclude) 
    { 
     element.find('span').replaceWith(transclude()); 
    } 
}; 
+0

は、swehren、ありがとうございました。 – Francisc

+0

私にとって 'element'はテンプレートではなく、' div [my-transcluded-directive] 'を見つけます。 –

+0

@LittleBigBotあなたがフィドルを投稿したい場合は、私が見てみましょう – swehren

27

ng-transclude-replaceディレクティブを作成するのは簡単です。ここにはオリジナルのコピーキットng-transcludeがあります。

directive('ngTranscludeReplace', ['$log', function ($log) { 
       return { 
        terminal: true, 
        restrict: 'EA', 

        link: function ($scope, $element, $attr, ctrl, transclude) { 
         if (!transclude) { 
          $log.error('orphan', 
            'Illegal use of ngTranscludeReplace directive in the template! ' + 
            'No parent directive that requires a transclusion found. '); 
          return; 
         } 
         transclude(function (clone) { 
          if (clone.length) { 
           $element.replaceWith(clone); 
          } 
          else { 
           $element.remove(); 
          } 
         }); 
        } 
       }; 
      }]); 

PS:あなたも、これは角度1.4.9で動作します(とあまりにも早くPROB)ng-transclude

+0

ありがとう!私は、transclusionを使用するディレクティブで動作する実行可能なソリューションを探していましたが、ng-repeatの一部でもあります。受け入れられた解決策は動作しますが、ng-repeatでは動作しません。私はそれが 'terminal:true'と関係していると思っています。最高の部分は、このコードのユーザーはそれが動作するためにそれを知る必要はありません:) –

+0

ブリリアント。ちょうど私があなたに非常に感謝したかったもの。 IMHOこれは、どこでも空で無駄な余分なネスティングDom要素を残すのではなく、transcludeのデフォルトの動作でなければなりません! – Roaders

4

の違いを見るためにthis linkを確認することができます

return { 
     restrict: 'E', 
     replace: true, 
     template: '<span data-ng-transclude></span>', 
     transclude: true, 
     link: function (scope, el, attrs) ......... 
}