2016-06-02 6 views
2

属性を使ってディレクティブに "テンプレート"を渡したいと思っています。ここで私が達成しようとしているものの陳腐な例を示します。ディレクティブの属性として式を持つテンプレートを提供する

このHTML:Hello Jim

<greeter person-name="Jim" greeting-template="Hello {{name}}"></greeter> 

が出力を生成します。 greeting-template属性に{{name}}が親スコープで評価されますので、それはディレクティブリンク機能限り取得する前に、

function greeter($interpolate) { 
    var directive = { 
     link: link, 
     restrict: 'EA', 
     template: '<div>{{evaluatedTemplate}}</div>' 
    }; 
    return directive; 

    function link(scope, element, attrs) { 
     scope.name = attrs.personName; 
     scope.evaluatedTemplate = $interpolate(attrs.greetingTemplate)(scope); 
    } 
} 

しかし、それは動作しません:

は、私はこのようなディレクティブで試してみました。

最終的には、attrs.greetingTemplateの値が文字通りの文字列である必要があります。「Hello {{名前}}」。私はgreeting-templateの属性値を "Hello [name]"とし、補間する前に "["を "{{"に変換するなどの代替構文でこれを行うことができます。しかし、それは乱雑に感じる。結びつきについても見てきましたが、親のスコープに対するディレクティブを評価する方法は、私が複数の挨拶をしたときに問題を引き起こす可能性があります。

+0

多分https://docs.angularjs.org/api/ng/directive/ngNonBindableを試してください – Phil

+0

'greet'要素に' ng-non-bindable'属性を設定すると、 'greeting-template'属性が角度評価(良い)、それはまた、指示全体が評価されない(悪い)ことを防ぎます。それは答えではありません。 – Snixtor

+1

'{{}}'の代わりにhtmlに異なる中カッコを使用し、それを自分で解析します。または、オプションオブジェクトを使用してコントローラからそれを渡す – charlietfl

答えて

1

link関数を使用する代わりに、スコープへのリンクが発生する前に実行されるcompile関数を使用して、テンプレート要素(元のDOM要素)と解釈されない属性を引数として渡します。私はあなたがここで探しているものだと思います。 compile機能で

、あなたはそれをバインドすることができます(あなたはむしろcompileよりlinkを使用する場合link関数と同じである)あなたのpost-link機能で後で使用するための変数でuninterpolatedテンプレート文字列を格納することができあなたの範囲に。

だからあなたのディレクティブはcompileプロパティではなくlinkプロパティで、次のようになります。作業それを示す

function greeter($interpolate) { 
    var directive = { 
    compile: compile, 
    restrict: 'EA', 
    scope: true, 
    template: '<div>{{evaluatedTemplate}}</div>' 
    }; 
    return directive; 

    function compile(tElement, tAttrs) { 

    // save the uninterpolated template for use in our post-link function 
    var greetingTemplateUninterpolated = tAttrs.greetingTemplate; 

    return { 
     pre: function (scope, element, attrs) {}, 
     post: function (scope, element, attrs) { 
     scope.name = attrs.personName; 
     scope.evaluatedTemplate = $interpolate(greetingTemplateUninterpolated)(scope); 
     } 
    }; 
    } 
} 

Here's a fiddle

およびhere's実際にどのように良い記事を説明しているのですかcompileおよびlinkが機能します。

+0

素晴らしい!私はただ一つの変更を提案できれば、それは原型的に継承された、または分離された、独自のスコープを持つ方が良いでしょう。私は 'scope:true'の編集を勧めました。 – Snixtor

+1

私は完全に同意します。それも私の考えでしたが、それはあなたの元の指示にはなかったので、私はあなたがそれを放置する特定の理由があるかどうかを知らずにそれを追加したくありませんでした。 – MikeJ

関連する問題