2013-10-16 7 views
13

余分な要素を追加しないで、ディレクティブに一部のコンテンツをクロールする方法はありますか?例えば新しい要素を追加せずにAngularJSで転記する

ディレクティブ:

{ 
    scope: { 
     someParam: "=" 
    }, 
    link: function(scope, element, attrs){ 
     //do something 
    }, 
    transclude: true, 
    template:'<div ng-transclude></div>' 
} 

ソースHTML:

<div my-directive some-param="somethingFromController"> 
    my transcluded content: {{somethingElseFromController}} 
</div> 

この例では、余分なdiv要素をマークアップに追加されます。通常これはうまくいくでしょうが、このディレクティブをテーブルの内側で使用しようとしていますので、divタグを追加するとそれが問題になります。

余分なdivタグを取り除くtranscludeまたはtemplateも指定しないようにしましたが、今ではは隔離されたスコープ内にあるため、見つからないことがあります。私は孤立したスコープを作成するのではなく、リンク関数内のattrsオブジェクトから自分のディレクティブのパラメータを取得することができますが、スコープで文字列を評価する必要はありません。

誰でもこれを達成する方法を知っていますか? ありがとう!ロブのポスト@については詳しく説明し

+0

somethingElseFromController'は 'こと「トランスクルード」コンテンツとは何か提供することを意味する? –

+0

何でもかまいません。例えばコントローラからの文字列私は、コントローラーと同じスコープ内にあるように、私のトランスコードされたコンテンツが必要です。 – rob

+1

angleには、スコープを 'ハングする'要素が必要です。しかし、単に振る舞いを追加しようとしている場合は、あなたが言ったように、テンプレートは必要ありません。はい。それ以外の場合は、親スコープを使用します。 –

答えて

7

これは実際には角度で可能です。 ng-repeatのような指令はこれを行います。あなたのやり方は次のとおりです。

{ 
    restrict: 'A', 
    transclude: true, 
    compile: function (tElement, attrs, transclude) { 
     return function ($scope) { 
      transclude($scope, function (clone) { 
       tElement.append(clone); 
      }); 
     }; 
    } 
}; 

ここには何がありますか?リンク中に、私たちは、transcludeしようとしている要素であるクローンをディレクティブの要素に追加するだけです。 Angularは、$ scopeをクローン要素に適用し、その要素内のすべての角度の良さを実行できます。

+7

このソリューションはAngularの新しいバージョンでは非推奨となっています。具体的には、transclude引数の使用がコンパイル関数に渡されました。これを行うために現在受け入れられている「正しい」方法は、リンク関数でtransclude引数を代わりに使用すること(リンクに渡された5番目の引数)を除いて、上記と同じです。 –

4

...

トランスクルーは/生き続けている...内容がテキストである場合、それは角度がどんなタグディレクティブの内容のクローンである要素を作成することが必要ですそれをスパンで包みます。

これは、$ compileが呼び出されたときにスコープを適用するためのDOM要素を持っているためです。

したがって、基本的にtranscludeは、同じ理由で要素を追加しません。$compile('plain text here {{wee}}')

$interpolateを使って何かしようとしているようなことをすることができます。これにより、 "blah {{foo}}"のような文字列の範囲に範囲を適用できます。私は本当にあなたが何をしようとしているのか分からない、私は本当に具体的な例を与えることはできません。

+0

どのようなtranscludeですか? – IamStalker

+0

ブーム!簡単な答えを見つけるのがどれくらいの時間を要しているのかは驚くべきことですが、ここのビットは私のためにそれを解き放ちました。 "Angularは、ディレクティブが存在するタグの内容の複製である要素を作成する必要があります。コンテンツがテキストの場合は、スパンでラップします。 ありがとうございました! –

8

@Vakeyは私が探していたものを答えました。

しかし、今日のように、角度のドキュメントは言う:

compile関数に渡されtransclude機能が例えばそれとして、を推奨されていません右の外側の範囲について知りません。代わりにlink関数に渡されるtransclude関数を使用してください。

例の一部が$compile documentationに示すように、だから私は、(一瞬)の代わりにcontrollerを使用し、その$transclude機能:

controller: function($scope, $element, $transclude) { 
      var transcludedContent, transclusionScope; 

      $transclude(function(clone, scope) { 
       $element.append(clone); 
       transcludedContent = clone; 
       transclusionScope = scope; 
      }); 
     }, 
+0

角度2の場合、これは現在**投影**として知られています(http://stackoverflow.com/a/42019804/2012945を参照)。 – edmundo096

関連する問題