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>
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 を使用する必要があります。
HTML文字列を変換するには、コントローラで$sce.trustAsHtml()
を使用します。
$scope.thisCanBeusedInsideNgBindHtml = $sce.trustAsHtml(someHtmlVar);
2つのステップがあります。
angular-sanitize.min.jsリソースを含めます。<script src="lib/angular/angular-sanitize.min.js"></script>
Jsファイル(コントローラまたは通常app.js)にngSanitizeを含めます。angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'ngSanitize'])
次のようにフィルタを作成することもできます。
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の脆弱性を引き起こす可能性があります。
上記のリンクで提供された解決策は私のために働いた、このスレッドのオプションのどれもしなかった。 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>
幸い、このエラーメッセージを回避するために派手なフィルタや危険な方法は必要ありません。これは、意図した安全な方法でビューに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 は 答え です。
私は今日試してみました、私が見つけた唯一の方法はこれでした
<div ng-bind-html-unsafe="expression"></div>
ng-bind-html-unsafe
は機能しなくなりました。
これが最短の方法です:
フィルタを作成します。
myApp.filter('unsafe', function($sce) { return $sce.trustAsHtml; });
そしてあなたの見方では:
<div ng-bind-html="customHtml | unsafe"></div>
P.SこのメソッドはngSanitize
モジュールをインクルードする必要はありません。
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);
でも動作します
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>
がんばろう。
これをngBindHtmlを使って Angular(v1.4)のドキュメントに従うだけで
<div ng-bind-html="expression"></div>
and expression can be "<ul><li>render me please</li></ul>"
モジュールの依存関係にngSanitizeを必ず含めてください。
スコープ属性を使用すること以外は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()
に置き換えても構いません。
この問題に対するもう一つの解決策は、新しい 属性またはディレクティブ を角度付きで作成することです。
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>
ng-include を使用することもできます。
<div class="col-sm-9 TabContent_container" ng-include="template/custom.html">
</div>
このテンプレートデータを非表示にするには、 "ng-show" を使用します。
つかいます
<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>
これがこのようなフィルターを作る解決策です
.filter('trusted',
function($sce) {
return function(ss) {
return $sce.trustAsHtml(ss)
};
}
)
そしてこれをng-bind-htmlのようにフィルタとして適用します
<div ng-bind-html="code | trusted">
そしてRuben Decropに感謝します
以下のように、[innerHTML]
を使うだけです。
<div [innerHTML]="htmlString"></div>
ng-bind-html
...を使う必要がある前に.
これは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>