web-dev-qa-db-ja.com

HTMLをビューに挿入する

AngularJSコントローラでHTMLフラグメントを作成し、このHTMLをビューに表示することは可能ですか?

これは、矛盾するJSON BLOBをid : valueペアのネストしたリストに変換するという要件から来ています。そのため、HTMLはコントローラ内で作成され、表示しようとしています。

モデルプロパティを作成しましたが、HTMLを印刷しないとビューに表示できません。


更新

問題は、作成されたHTMLを引用符で囲まれた文字列として角度レンダリングすることから生じるようです。これを回避する方法を見つけようとします。

コントローラの例:

var SomeController = function () {

    this.customHtml = '<ul><li>render me please</li></ul>';
}

ビューの例:

<div ng:bind="customHtml"></div>

与えます:

<div>
    "<ul><li>render me please</li></ul>"
</div>
767
Swaff

Angular 1.xの場合は、HTMLでng-bind-htmlを使用します。

<div ng-bind-html="thisCanBeusedInsideNgBindHtml"></div>

この時点でattempting to use an unsafe value in a safe contextエラーが発生するので、それを解決するには ngSanitize または $ sce を使用する必要があります。

$ sce

HTML文字列を変換するには、コントローラで$sce.trustAsHtml()を使用します。

 $scope.thisCanBeusedInsideNgBindHtml = $sce.trustAsHtml(someHtmlVar);

ngSanitize

2つのステップがあります。

  1. angular-sanitize.min.jsリソースを含めます。
    <script src="lib/angular/angular-sanitize.min.js"></script>

  2. Jsファイル(コントローラまたは通常app.js)にngSanitizeを含めます。
    angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngSanitize'])

1087
Luke Madera

次のようにフィルタを作成することもできます。

var app = angular.module("demoApp", ['ngResource']);

app.filter("trust", ['$sce', function($sce) {
  return function(htmlCode){
    return $sce.trustAsHtml(htmlCode);
  }
}]);

それからビューで

<div ng-bind-html="trusted_html_variable | trust"></div>

:このフィルタは、渡されたすべてのHTMLを信頼し、ユーザー入力を含む変数が渡されるとXSSの脆弱性を引き起こす可能性があります。

304

Angular JSはタグ内にHTMLを表示します

上記のリンクで提供された解決策は私のために働いた、このスレッドのオプションのどれもしなかった。 AngularJSバージョン1.2.9で同じものを探している人のために

これがそのコピーです。 

わかりました私はこれのための解決策を見つけました:

JS:

$scope.renderHtml = function(html_code)
{
    return $sce.trustAsHtml(html_code);
};

HTML:

<p ng-bind-html="renderHtml(value.button)"></p>

編集:

これがセットアップです。

JSファイル:

angular.module('MyModule').controller('MyController', ['$scope', '$http', '$sce',
    function ($scope, $http, $sce) {
        $scope.renderHtml = function (htmlCode) {
            return $sce.trustAsHtml(htmlCode);
        };

        $scope.body = '<div style="width:200px; height:200px; border:1px solid blue;"></div>'; 

    }]);

HTMLファイル

<div ng-controller="MyController">
    <div ng-bind-html="renderHtml(body)"></div>
</div>
116
anpatel

幸い、このエラーメッセージを回避するために派手なフィルタや危険な方法は必要ありません。これは、意図した安全な方法でビューにHTMLマークアップを正しく出力するための完全な実装です。

サニタイズモジュールはAngularの後に含める必要があります。

<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular-sanitize.js"></script>

その後、モジュールをロードする必要があります。

angular.module('app', [
  'ngSanitize'
]);

これにより、コントローラ、ディレクティブなどからの文字列にマークアップを含めることができます。

scope.message = "<strong>42</strong> is the <em>answer</em>.";

最後に、テンプレートでは、それは次のように出力されなければなりません:

<p ng-bind-html="message"></p>

これは期待される出力を生成するでしょう: 42 答え です。

63

私は今日試してみました、私が見つけた唯一の方法はこれでした

<div ng-bind-html-unsafe="expression"></div>

61
Damax

ng-bind-html-unsafeは機能しなくなりました。 

これが最短の方法です:

フィルタを作成します。

myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });

そしてあなたの見方では:

<div ng-bind-html="customHtml | unsafe"></div>

P.SこのメソッドはngSanitizeモジュールをインクルードする必要はありません。

51

hTMLで

<div ng-controller="myAppController as myCtrl">

<div ng-bind-html-unsafe="myCtrl.comment.msg"></div>

OR

<div ng-bind-html="myCtrl.comment.msg"></div

コントローラー上

mySceApp.controller("myAppController", function myAppController( $sce) {

this.myCtrl.comment.msg = $sce.trustAsHtml(html);

$scope.comment.msg = $sce.trustAsHtml(html);でも動作します

25
Sotos

Angular 4以降、これが現在うまくいく方法です。

<div [innerHTML]="htmlString">
</div>

この質問から取られた ここ。

16
Garth

Ng-sanitizeを使用してもHTMLにng-clickを追加できないことがわかりました。

これを解決するために、ディレクティブを追加しました。このような:

app.directive('htmldiv', function($compile, $parse) {
return {
  restrict: 'E',
  link: function(scope, element, attr) {
    scope.$watch(attr.content, function() {
      element.html($parse(attr.content)(scope));
      $compile(element.contents())(scope);
    }, true);
  }
}
});

これがHTMLです。

<htmldiv content="theContent"></htmldiv>

がんばろう。

9
Matt

これをngBindHtmlを使って Angular(v1.4)のドキュメントに従うだけで

<div ng-bind-html="expression"></div> 
and expression can be "<ul><li>render me please</li></ul>"

モジュールの依存関係にngSanitizeを必ず含めてください。

6
Henry Neo

スコープ属性を使用すること以外はblrbrと非常によく似ていますが、次の解決策があります。

angular.module('app')
.directive('renderHtml', ['$compile', function ($compile) {
    return {
      restrict: 'E',
      scope: {
        html: '='
      },
      link: function postLink(scope, element, attrs) {

          function appendHtml() {
              if(scope.html) {
                  var newElement = angular.element(scope.html);
                  $compile(newElement)(scope);
                  element.append(newElement);
              }
          }

          scope.$watch(function() { return scope.html }, appendHtml);
      }
    };
  }]);

その後 

<render-html html="htmlAsString"></render-html>

element.append()element.replaceWith()に置き換えても構いません。

4
jmb-mage

この問題に対するもう一つの解決策は、新しい 属性またはディレクティブ を角度付きで作成することです。

product-specs.html 

 <h4>Specs</h4>
        <ul class="list-unstyled">
          <li>
            <strong>Shine</strong>
            : {{product.shine}}</li>
          <li>
            <strong>Faces</strong>
            : {{product.faces}}</li>
          <li>
            <strong>Rarity</strong>
            : {{product.rarity}}</li>
          <li>
            <strong>Color</strong>
            : {{product.color}}</li>
        </ul>

app.js

 (function() {
var app = angular.module('gemStore', []);    
app.directive("     <div ng-show="tab.isSet(2)" product-specs>", function() {
return {
  restrict: 'E',
  templateUrl: "product-specs.html"
};
});

index.html

 <div>
 <product-specs>  </product-specs>//it will load product-specs.html file here.
 </div>

または 

<div  product-specs>//it will add product-specs.html file 

または 

<div ng-include="product-description.html"></div>

https://docs.angularjs.org/guide/directive

3
yugi

ng-include を使用することもできます。 

<div class="col-sm-9 TabContent_container" ng-include="template/custom.html">
</div>

このテンプレートデータを非表示にするには、 "ng-show" を使用します。

3
Vikash Sharma

つかいます

<div ng-bind-html="customHtml"></div>

そして

angular.module('MyApp', ['ngSanitize']);

そのためには、例えば以下のようにhtmlファイルにangular-sanitize.js、を含める必要があります。

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular-sanitize.js"></script>
1
Patricia Beier

これがこのようなフィルターを作る解決策です 

.filter('trusted',
   function($sce) {
     return function(ss) {
       return $sce.trustAsHtml(ss)
     };
   }
)

そしてこれをng-bind-htmlのようにフィルタとして適用します

<div ng-bind-html="code | trusted">

そしてRuben Decropに感謝します

1
bahri noredine

以下のように、[innerHTML]を使うだけです。

<div [innerHTML]="htmlString"></div>

ng-bind-html...を使う必要がある前に.

0
Alireza

これはngSanitizeを必要としない、単純な(そして安全でない)bind-as-htmlディレクティブです。

myModule.directive('bindAsHtml', function () {
    return {
        link: function (scope, element, attributes) {
            element.html(scope.$eval(attributes.bindAsHtml));
        }
    };
});

信頼できないコンテンツをバインドした場合、セキュリティ上の問題が発生する可能性があります。

こんな感じで使う:

<div bind-as-html="someHtmlInScope"></div>
0
user3638471