2017-05-17 4 views
2

ディレクティブ内にHTMLコードの文字列を作成し、それをディレクティブのテンプレートとして使用しようとしています。ディレクティブ内にテンプレート文字列を作成する

私はこれを試しましたが、動作しません。

myApp.directive('myDirective', [function() { 
    return { 
     restrict: 'E', 
     scope: { 
      data: '='  // this is the data that will shape the HTML 
     }, 
     template: str, 
     controller: function($scope){ 
      $scope.str = ****BUILD THE STRING HERE USING 'data'**** 
     } 
    }; 
}]); 

は私がこれを行うことができます方法については困惑している

myApp.directive('myDirective', ['$scope', function($scope) { 
    var str = ****BUILD THE STRING HERE USING $scope.data**** 
    return { 
     restrict: 'E', 
     template: str 
    }; 
}]); 
をそれから私は、ディレクティブにアプリのスコープを渡してみましたが、再びエラーが発生しました。最初の例では文字列が正しく構築されており、私は

template: {{str}} 

を行うとき、私は、文字列を参照しますが、明らかに、それだけでページ上のテキストとして表示され、それはHTMLコードとして解釈されていません。

ディレクティブのreturn文の中で、myAppまたはディレクティブコントローラのスコープにアクセスする方法はありますか?

ディレクティブの外側に文字列を作成することはできますが、それを行ってもディレクティブ内でmyAppのスコープにアクセスすることはできません。

+1

$ scopeはサービスではありません。あなたは指示にそれを注入することはできません。テンプレートは静的な文字列で、スコープ内のデータに基づいて動的にHTMLを生成するために使用されます。テンプレートとして渡す前に文字列を動的に生成したいのはなぜですかあなたが達成しようとしているのは何ですか? –

+1

要するに、私のアプリにはいくつかのデータがあります。ユーザーはデータの変化に応じて異なるHTMLが表示されるはずです。データを垂直に表示します。そうでない場合は、水平に表示されます。私はJSで文字列としてHTMLを構築しようとしています(if文とループを使用して)ビューに表示します。私が達成しようとしているのは、テンプレートそのものを動的にすることによって、HTMLをデータの変化に対応させることです。 – Sarp

答えて

1

ディレクティブは、内部スコープ(または分離スコープ)で厳密に定義していない場合は、外部スコープにアクセスできます。例:

angular.module('app',[]).controller('ctrl', function($scope) { 
 
    $scope.example = { 
 
    message: "Hello world" 
 
    }; 
 
}).directive("myDirective", function() { 
 
    return { 
 
    template: '<strong>{{example.message}}</strong>' 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="ctrl"> 
 
    <div my-directive></div> 
 
</div>

あなたは上記の例に見ることができるように - ディレクティブは、あなたが実際にそれを注入する必要なしに、外側のスコープ値を「知っています」。

さて、あなたは孤立スコープを作成することができますし、これを行うことにより、指定したスコープに自分自身を制限しない:

angular.module('app',['ngSanitize']).controller('ctrl', function($scope) { 
 
    $scope.example = { 
 
    html: "<strong>Hello world</strong>" 
 
    }; 
 
}).directive("myDirective", function() { 
 
    return { 
 
    scope: { 
 
     data: '=' 
 
    }, 
 
    template: '<div ng-bind-html="data"></div>' 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-sanitize.min.js"></script> 
 
<div ng-app="app" ng-controller="ctrl"> 
 
    <div my-directive data="example.html"></div> 
 
</div>

ngSanitizeを含むことで、私はngBindHtmlを使用することができディレクティブ内部のスコープにHTML構造体を渡します。

+0

偉大な答え!私は今、それを得る、ありがとう!私はそれをupvoteだろうが、それは私を許されません:/ – Sarp

0

厳密に言えば、ng-ifを使用して、コントローラのデータ数に基づいて異なるディレクティブを使用するhtmlを出力することで達成できます。これは、あなたのプレゼンテーションロジックが所属するビューに移動することを意味し、コントローラーはデータカウント変数を含むビジネスロジックに関係します(これをng -if)。

この方法を使用する場合は、コントローラが使用するサービスにデータを取得し、両方のディレクティブに同じコントローラを使用することをお勧めします。

関連する問題