HTMLをバインドしたい要素があります。
<div ng-bind-html="details" upper></div>
うまくいきます。これで、バインドされたhtmlにバインドされたディレクティブもあります。
$scope.details = 'Success! <a href="#/details/12" upper>details</a>'
ただし、upper
divとanchorを含むディレクティブは評価されません。どうすれば機能しますか?
HTMLをバインドしたい要素があります。
<div ng-bind-html="details" upper></div>
うまくいきます。これで、バインドされたhtmlにバインドされたディレクティブもあります。
$scope.details = 'Success! <a href="#/details/12" upper>details</a>'
ただし、upper
divとanchorを含むディレクティブは評価されません。どうすれば機能しますか?
回答:
私もこの問題に直面しており、インターネットを何時間も検索した後、@ Chandermaniのコメントを読みました。これが解決策であることがわかりました。次のパターンで「コンパイル」ディレクティブを呼び出す必要があります。
<div compile="details"></div>
.directive('compile', ['$compile', function ($compile) {
return function(scope, element, attrs) {
scope.$watch(
function(scope) {
// watch the 'compile' expression for changes
return scope.$eval(attrs.compile);
},
function(value) {
// when the 'compile' expression changes
// assign it into the current DOM
element.html(value);
// compile the new DOM and link it to the current
// scope.
// NOTE: we only compile .childNodes so that
// we don't get into infinite loop compiling ourselves
$compile(element.contents())(scope);
}
);
};
}])
function(scope, element, attrs)
、これらの3つの引数、scope、element、およびattrsからどこで取得しましたか?
link
プロパティのAngularフレームワークの署名の一部です。それらはlink
、Angularフレームワークによって呼び出されるたびに自動的に渡されます。いつでも利用できます。
$sce.trustAsHtml
このディレクティブで「コンパイル」されるHTMLを作成するために別の関数から使用している場合は、削除する必要があります。@apoplexyに感謝
素晴らしい回答vkammererをありがとう。私がお勧めする最適化の1つは、コンパイルが1回実行された後に監視しないことです。ウォッチ式内の$ evalは、パフォーマンスに影響を与える可能性があります。
angular.module('vkApp')
.directive('compile', ['$compile', function ($compile) {
return function(scope, element, attrs) {
var ensureCompileRunsOnce = scope.$watch(
function(scope) {
// watch the 'compile' expression for changes
return scope.$eval(attrs.compile);
},
function(value) {
// when the 'compile' expression changes
// assign it into the current DOM
element.html(value);
// compile the new DOM and link it to the current
// scope.
// NOTE: we only compile .childNodes so that
// we don't get into infinite loop compiling ourselves
$compile(element.contents())(scope);
// Use un-watch feature to ensure compilation happens only once.
ensureCompileRunsOnce();
}
);
};
}]);
.directive()
しますが、回答に投稿されたコードのコードは機能しません。
$eval
- attrs.compile
監視される無名関数の代わりに直接使用できます。文字列式を指定しただけの場合、angularは$eval
とにかくそれを呼び出します。
このディレクティブangular-bind-html-compileを追加します
.directive('bindHtmlCompile', ['$compile', function ($compile) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
scope.$watch(function () {
return scope.$eval(attrs.bindHtmlCompile);
}, function (value) {
// Incase value is a TrustedValueHolderType, sometimes it
// needs to be explicitly called into a string in order to
// get the HTML string.
element.html(value && value.toString());
// If scope is provided use it, otherwise use parent scope
var compileScope = scope;
if (attrs.bindHtmlScope) {
compileScope = scope.$eval(attrs.bindHtmlScope);
}
$compile(element.contents())(compileScope);
});
}
};
}]);
次のように使用します。
<div bind-html-compile="data.content"></div>
本当に簡単です:)
すでに$sce.trustAsHtml
ここで実行されたコンテンツを扱う人にとっては、私が異なってしなければならなかったことです
function(scope, element, attrs) {
var ensureCompileRunsOnce = scope.$watch(function(scope) {
return $sce.parseAsHtml(attrs.compile)(scope);
},
function(value) {
// when the parsed expression changes assign it into the current DOM
element.html(value);
// compile the new DOM and link it to the current scope.
$compile(element.contents())(scope);
// Use un-watch feature to ensure compilation happens only once.
ensureCompileRunsOnce();
});
}
link
別のレイアウトを使用しているため、これはディレクティブの一部にすぎません。$sce
だけでなく、サービスを注入する必要があり$compile
ます。
私が見つけた最善の解決策!私はそれをコピーしました、そしてそれは私が必要とするのと全く同じです。ありがとう、ありがとう、ありがとう...
私が持っているディレクティブリンク機能で
app.directive('element',function($compile){
.
.
var addXml = function(){
var el = $compile('<xml-definitions definitions="definitions" />')($scope);
$scope.renderingElement = el.html();
}
.
.
ディレクティブテンプレート:
<span compile="renderingElement"></span>