Вроде новичок в angular. Можно ли заменить узел ng-include содержимым включенного шаблона? Например, с:
<div ng-app>
<script type="text/ng-template" id="test.html">
<p>Test</p>
</script>
<div ng-include src="'test.html'"></div>
</div>
Сгенерированный html:
<div ng-app>
<script type="text/ng-template" id="test.html">
<p>Test</p>
</script>
<div ng-include src="'test.html'">
<span class="ng-scope"> </span>
<p>Test</p>
<span class="ng-scope"> </span>
</div>
</div>
Но я хочу:
<div ng-app>
<script type="text/ng-template" id="test.html">
<p>Test</p>
</script>
<p>Test</p>
</div>
'test.html'
чтобы использовать шаблон, а не URL-адресОтветы:
У меня была такая же проблема, и я все еще хотел, чтобы функции ng-include включали динамический шаблон. Я создавал динамическую панель инструментов Bootstrap, и мне нужна была более чистая разметка для правильного применения стилей CSS.
Вот решение, которое я придумал для тех, кому интересно:
HTML:
<div ng-include src="dynamicTemplatePath" include-replace></div>
Специальная директива:
app.directive('includeReplace', function () { return { require: 'ngInclude', restrict: 'A', /* optional */ link: function (scope, el, attrs) { el.replaceWith(el.children()); } }; });
Если бы это решение использовалось в приведенном выше примере, установка для scope.dynamicTemplatePath значения 'test.html' привела бы к желаемой разметке.
источник
Итак, благодаря @ user1737909 я понял, что ng-include - это не выход. Директивы - лучший и более ясный подход.
var App = angular.module('app', []); App.directive('blah', function() { return { replace: true, restrict: 'E', templateUrl: "test.html" }; });
В html:
<blah></blah>
источник
replace:true
в шаблонах отмечена отметка о прекращении поддержки . Я бы не стал использовать это решение из-за статуса устаревшего.У меня была такая же проблема, моей сторонней таблице стилей css не понравился дополнительный элемент DOM.
Мое решение было супер-простым. Просто переместите ng-include 1 вверх. Так что вместо
<md-sidenav flex class="md-whiteframe-z3" md-component-id="left" md-is-locked-open="$media('gt-md')"> <div ng-include="myService.template"></span> </md-sidenav>
Я просто сделал:
<md-sidenav flex class="md-whiteframe-z3" md-component-id="left" md-is-locked-open="$media('gt-md')" ng-include="myService.template"> </md-sidenav>
Готов поспорить, это сработает в большинстве ситуаций, даже если технически вопрос не в этом.
источник
Другая альтернатива - написать собственную простую директиву replace / include, например
.directive('myReplace', function () { return { replace: true, restrict: 'A', templateUrl: function (iElement, iAttrs) { if (!iAttrs.myReplace) throw new Error("my-replace: template url must be provided"); return iAttrs.myReplace; } }; });
Затем это будет использоваться следующим образом:
<div my-replace="test.html"></div>
источник
Это правильный способ замены детей
angular.module('common').directive('includeReplace', function () { return { require: 'ngInclude', restrict: 'A', compile: function (tElement, tAttrs) { tElement.replaceWith(tElement.children()); return { post : angular.noop }; } }; });
источник
compile
вlink
, потому что на этапе компиляции мой элемент был пуст.Следующая директива расширяет функциональность нативной директивы ng-include.
Он добавляет прослушиватель событий для замены исходного элемента, когда контент готов и загружен.
Используйте его как обычно, просто добавьте атрибут «заменить»:
<ng-include src="'src.html'" replace></ng-include>
или с обозначением атрибута:
<div ng-include="'src.html'" replace></div>
Вот директива (не забудьте включить модуль 'include-replace' как зависимость):
angular.module('include-replace', []).directive('ngInclude', function () { return { priority: 1000, link: function($scope, $element, $attrs){ if($attrs.replace !== undefined){ var src = $scope.$eval($attrs.ngInclude || $attrs.src); var unbind = $scope.$on('$includeContentLoaded', function($event, loaded_src){ if(src === loaded_src){ $element.next().replaceWith($element.next().children()); unbind(); }; }); } } }; });
источник
Я бы выбрал более безопасное решение, чем то, которое предлагает @Brady Isom.
Я предпочитаю полагаться на предоставленную
onload
опцию,ng-include
чтобы убедиться, что шаблон загружен, прежде чем пытаться его удалить..directive('foo', [function () { return { restrict: 'E', //Or whatever you need scope: true, template: '<ng-include src="someTemplate.html" onload="replace()"></ng-include>', link: function (scope, elem) { scope.replace = function () { elem.replaceWith(elem.children()); }; } }; }])
Нет необходимости во второй директиве, поскольку все обрабатывается внутри первой.
источник
let ngInclude = angular.element( element[ 0 ].querySelector( 'ng-include' ) ); ngInclude.replaceWith( ngInclude.children() );