Как сделать ng-bind-html компилировать код angularjs
Я работаю с angularjs 1.2.0-rc.3. Я хотел бы включить html-код в шаблон динамически. Для этого я использую в контроллере :
html = "<div>hello</div>";
$scope.unicTabContent = $sce.trustAsHtml(html);
в шаблоне я получил:
<div id="unicTab" ng-bind-html="unicTabContent"></div>
он отлично работает для обычного html-кода. Но когда я пытаюсь поставить угловой шаблон, он не интерпретируется, он просто включен в страницу. Например, я хотел бы включить :
<div ng-controller="formCtrl">
<div ng-repeat="item in content" ng-init="init()">
</div>
</div>
Спасибо большое
8 ответов:
это решение не использует жестко закодированные шаблоны, и Вы можете скомпилировать угловые выражения, встроенные в ответ API.
Шаг 1. Установите эту директиву:https://github.com/incuna/angular-bind-html-compile
Шаг 2. включить директиву в модуле.
angular.module("app", ["angular-bind-html-compile"])
Шаг 3. используйте директиву в шаблон:
<div bind-html-compile="letterTemplate.content"></div>
результат:
Объект$scope.letter = { user: { name: "John"}}
ответ JSON
{ "letterTemplate":[ { content: "<span>Dear {{letter.user.name}},</span>" } ]}
HTML Output =
<div bind-html-compile="letterTemplate.content"> <span>Dear John,</span> </div>
для справки, вот соответствующая директива:
(function () { 'use strict'; var module = angular.module('angular-bind-html-compile', []); module.directive('bindHtmlCompile', ['$compile', function ($compile) { return { restrict: 'A', link: function (scope, element, attrs) { scope.$watch(function () { return scope.$eval(attrs.bindHtmlCompile); }, function (value) { element.html(value); $compile(element.contents())(scope); }); } }; }]); }());
это то, что я сделал, не знаю, если это угловое способомTM, но это работает и очень просто;
.directive('dynamic', function($compile) { return { restrict: 'A', replace: true, link: function (scope, element, attrs) { scope.$watch(attrs.dynamic, function(html) { $compile(element.html(html).contents())(scope); }); } }; });
так,
<div id="unicTab" dynamic="unicTabContent"></div>
Edit:я нашел угловой путь, и супер простой.
$templateCache.put('unicTabContent', $sce.trustAsHtml(html));
<div id="unicTab" ng-include="'unicTabContent'"></div>
не нужно делать свои собственные директивы или что-нибудь. Но это привязка-когда-то вроде сделки, он не будет видеть изменения HTML-код как пользовательские директива.
<script type="text/ng-template" id="unic_tab_template.html"> <div ng-switch on="page"> <div ng-switch-when="home"><p>{{home}}</p></div> <div ng-switch-when="form"> <div ng-controller="formCtrl"> <div ng-repeat="item in content">{{item.name}}:{{item.value}}</div> </div> </div> <div ng-switch-default>an error accured</div> </div> </script>
этот шаблон является условным, поэтому в зависимости от значения $scope.страница, она переключается между 3 шаблонами (третий является обработчиком ошибок). Чтобы использовать его у меня было :
<div id="unicTab" ng-controller="unicTabCtrl"> <div ng-include="'unic_tab_template.html'"></div> </div>
таким образом, моя страница изменяется в зависимости от $ scope внутри моего unicTabCtrl контроллер.
чтобы завершить идею вставки швов шаблона angularsjs, которые трудно реализовать ($compile seams to be the solution, но я не смог заставить его работать). Но вместо этого вы можете использовать условные шаблоны.
Я пытался сделать то же самое и наткнулся на этот модуль.
http://ngmodules.org/modules/ng-html-compile
Я просто включил его, и тогда я был в состоянии использовать "НГ-HTML-код-компиляции" вместо "НГ-привязать HTML-код"
один из способов-использовать директиву для вставки пользовательских шаблонов, которые включают угловые выражения
<div id="unicTab" unic-tab-content></div>
app.directive("unicTabContent",function(){ return { restrict:"A", template:'{{unicTabContent}}' } })
мое решение подобной проблемы в моем текущем приложении без использования шаблона (не элегантный, но работает):
directive('ngBindHtmlCompile', ['$compile', function ($compile) { return { restrict: 'A', compile: function compile(tElement, tAttributes, transcludeFn) { return function postLink(scope, element, attributes) { scope.$watch(function() { return scope.$eval(attributes.ngBindHtml); }, function(newValue, oldValue) { $compile(element.children())(scope); }); }; } }; }]);
требует
ngBindHtml
на том же элементе и компилирует содержимое элемента после его изменения сngBindHtml
.<div id="unicTab" ng-bind-html="unicTabContent" ng-bind-html-compile></div>
ng-html-compile
похоже, но на первый взгляд он не будет пересчитан при изменении содержимого шаблона. Но я еще не пробовал.
приведенный ниже код намного проще, используя встроенные объекты Angular $interpolate и $sce. Сначала введите угловые объекты $interpolate и $sce в вашу директиву, поскольку вы делаете все, что вам нужно в вашей директиве.
amqApp.directive('myDir', ['$interpolate', '$sce', function ($interpolate,$sce ) {...}
затем создайте все переменные области, найденные в импортированных выражениях html...
$scope.custom = 'Hello World';
затем используйте $interpolate для обработки пользовательского HTML и его выражений...затем убедитесь, что вы используете объект $sce, чтобы доверять ему как HTML раньше обязательный...
var html = $interpolate('<b>{{custom}}</b>')($scope); $scope.data = $sce.trustAsHtml(html);
наконец, на ваш взгляд, просто убедитесь, что использовать элемент с "ng-bind" или "ng-bind-html" на нем в вашем представлении дисплея. Я нашел кусок $sce не будет отображать HTML как HTML (видит его как текст), если вы не свяжете его в своем шаблоне html, как это...
<span ng-bind-html="data"></span>
вы должны видеть жирным шрифтом...
Привет, Мир
я использовал этот трюк для импорта в текст / HTML с помощью пользовательских угловых {{выражений}} из a сеть.конфиг.