Un poco nuevo en angular. ¿Es posible reemplazar el nodo ng-include con el contenido de la plantilla incluida? Por ejemplo, con:
<div ng-app>
<script type="text/ng-template" id="test.html">
<p>Test</p>
</script>
<div ng-include src="'test.html'"></div>
</div>
El html generado es:
<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>
Pero lo que quiero es:
<div ng-app>
<script type="text/ng-template" id="test.html">
<p>Test</p>
</script>
<p>Test</p>
</div>
'test.html'
para usar la plantilla en lugar de la URLRespuestas:
Tuve este mismo problema y todavía quería que las características de ng-include incluyeran una plantilla dinámica. Estaba creando una barra de herramientas dinámica de Bootstrap y necesitaba el marcado más limpio para que los estilos CSS se aplicaran correctamente.
Aquí está la solución que se me ocurrió para aquellos que estén interesados:
HTML:
<div ng-include src="dynamicTemplatePath" include-replace></div>
Directiva personalizada:
app.directive('includeReplace', function () { return { require: 'ngInclude', restrict: 'A', /* optional */ link: function (scope, el, attrs) { el.replaceWith(el.children()); } }; });
Si esta solución se usara en el ejemplo anterior, establecer scope.dynamicTemplatePath en 'test.html' daría como resultado el marcado deseado.
fuente
Entonces, gracias a @ user1737909, me di cuenta de que ng-include no es el camino a seguir. Las directivas son el mejor enfoque y son más explícitas.
var App = angular.module('app', []); App.directive('blah', function() { return { replace: true, restrict: 'E', templateUrl: "test.html" }; });
En html:
<blah></blah>
fuente
replace:true
en las plantillas está marcado como obsoleto . Evitaría usar esta solución debido al estado de desaprobación.Tuve el mismo problema, a mi hoja de estilo CSS de terceros no le gustó el elemento DOM adicional.
Mi solución fue súper simple. Simplemente mueva el ng-include 1 hacia arriba. Entonces en lugar de
<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>
Simplemente hice:
<md-sidenav flex class="md-whiteframe-z3" md-component-id="left" md-is-locked-open="$media('gt-md')" ng-include="myService.template"> </md-sidenav>
Apuesto a que esto funcionará en la mayoría de las situaciones, aunque técnicamente no es lo que la pregunta hace.
fuente
Otra alternativa es escribir su propia directiva simple de reemplazo / inclusión, por ejemplo
.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; } }; });
Esto luego se usaría de la siguiente manera:
<div my-replace="test.html"></div>
fuente
Esta es la forma correcta de reemplazar a los niños.
angular.module('common').directive('includeReplace', function () { return { require: 'ngInclude', restrict: 'A', compile: function (tElement, tAttrs) { tElement.replaceWith(tElement.children()); return { post : angular.noop }; } }; });
fuente
compile
alink
, porque mi elemento estaba vacío durante la etapa de compilación.La siguiente directiva amplía la funcionalidad de la directiva nativa ng-include.
Agrega un detector de eventos para reemplazar el elemento original cuando el contenido está listo y cargado.
Úselo de la forma original, simplemente agregue el atributo "reemplazar":
<ng-include src="'src.html'" replace></ng-include>
o con notación de atributo:
<div ng-include="'src.html'" replace></div>
Aquí está la directiva (recuerde incluir el módulo 'incluir-reemplazar' como dependencia):
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(); }; }); } } }; });
fuente
Yo optaría por una solución más segura que la proporcionada por @Brady Isom.
Prefiero confiar en la
onload
opción dada porng-include
para asegurarme de que la plantilla esté cargada antes de intentar eliminarla..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()); }; } }; }])
No es necesaria una segunda directiva ya que todo se maneja dentro de la primera.
fuente
let ngInclude = angular.element( element[ 0 ].querySelector( 'ng-include' ) ); ngInclude.replaceWith( ngInclude.children() );