Meio novo no angular. É possível substituir o nó ng-include pelo conteúdo do modelo incluído? Por exemplo, com:
<div ng-app>
<script type="text/ng-template" id="test.html">
<p>Test</p>
</script>
<div ng-include src="'test.html'"></div>
</div>
O html gerado é:
<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>
Mas o que eu quero é:
<div ng-app>
<script type="text/ng-template" id="test.html">
<p>Test</p>
</script>
<p>Test</p>
</div>
'test.html'
para usar o modelo em vez do urlRespostas:
Eu tive o mesmo problema e ainda queria que os recursos do ng-include incluíssem um modelo dinâmico. Eu estava construindo uma barra de ferramentas dinâmica Bootstrap e precisava de uma marcação mais limpa para que os estilos CSS fossem aplicados corretamente.
Aqui está a solução que encontrei para aqueles que estão interessados:
HTML:
<div ng-include src="dynamicTemplatePath" include-replace></div>
Diretiva Customizada:
app.directive('includeReplace', function () { return { require: 'ngInclude', restrict: 'A', /* optional */ link: function (scope, el, attrs) { el.replaceWith(el.children()); } }; });
Se essa solução fosse usada no exemplo acima, definir scope.dynamicTemplatePath como 'test.html' resultaria na marcação desejada.
fonte
Então, graças a @ user1737909, percebi que ng-include não é a melhor opção. As diretivas são a melhor abordagem e mais explícitas.
var App = angular.module('app', []); App.directive('blah', function() { return { replace: true, restrict: 'E', templateUrl: "test.html" }; });
Em html:
<blah></blah>
fonte
replace:true
em modelos está marcado para suspensão de uso . Eu evitaria usar esta solução devido ao status de suspensão de uso.Eu tive o mesmo problema, minha folha de estilo css de terceiros não gostou do elemento DOM extra.
Minha solução foi super simples. Basta mover o ng-include 1 para cima. Então, em vez 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>
Eu simplesmente fiz:
<md-sidenav flex class="md-whiteframe-z3" md-component-id="left" md-is-locked-open="$media('gt-md')" ng-include="myService.template"> </md-sidenav>
Aposto que isso funcionará na maioria das situações, mesmo que tecnicamente não seja o que a pergunta está perguntando.
fonte
Outra alternativa é escrever sua própria diretiva substituir / incluir simples, por exemplo
.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; } }; });
Isso seria então usado da seguinte maneira:
<div my-replace="test.html"></div>
fonte
Esta é a maneira correta de substituir os filhos
angular.module('common').directive('includeReplace', function () { return { require: 'ngInclude', restrict: 'A', compile: function (tElement, tAttrs) { tElement.replaceWith(tElement.children()); return { post : angular.noop }; } }; });
fonte
compile
paralink
, porque meu elemento estava vazio durante o estágio de compilação.A diretiva a seguir estende a funcionalidade da diretiva nativa ng-include.
Ele adiciona um ouvinte de evento para substituir o elemento original quando o conteúdo está pronto e carregado.
Use-o da maneira original, basta adicionar o atributo "substituir":
<ng-include src="'src.html'" replace></ng-include>
ou com notação de atributo:
<div ng-include="'src.html'" replace></div>
Aqui está a diretiva (lembre-se de incluir o módulo 'incluir-substituir' como dependência):
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(); }; }); } } }; });
fonte
Eu escolheria uma solução mais segura do que a fornecida por @Brady Isom.
Prefiro contar com a
onload
opção fornecida porng-include
para garantir que o modelo seja carregado antes de tentar removê-lo..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()); }; } }; }])
Não há necessidade de uma segunda diretriz, pois tudo é tratado dentro da primeira.
fonte
let ngInclude = angular.element( element[ 0 ].querySelector( 'ng-include' ) ); ngInclude.replaceWith( ngInclude.children() );