template renderer2 manipulation manipular example elementref con javascript dom angularjs

javascript - manipulation - renderer2 angular



Angular: ¿Cómo puedo eliminar del DOM un elemento que he usado $ compile? (3)

Lo que necesito es la funcionalidad de dos ng-views. Porque no puedo, quiero cambiar el código interno de algo y compilarlo. El problema que tengo es que cuando vuelvo a cambiar el contenido, puedo compilar, pero si Angular elimina el enlace por sí mismo, o si tengo que hacerlo manualmente, ¿cómo?

EDITAR: explicando

Quiero hacer un modal, cuyo contenido pueda cambiar y enlazar a diferentes ámbitos (de ahí la compilación de $). Pero no quiero destruir todo el modal, solo parte de su contenido, y cambiar a otro. Mi duda principal es si al eliminar algunos HTML compilados puede provocar pérdidas de memoria.

Resuelto

Para este problema, creé un nuevo ámbito secundario (con $ nuevo) y lo destruí cada vez que cambiaba el contenido. Gracias por todo


Gracias por tu buena solución. Acabo de publicar un código de implemento

.directive(''modal'', function($templateCache, $compile) { return function(scope, element, attrs) { var currentModalId = attrs.modalId; var templateHtml = $templateCache.get(attrs.template); var modalScope, modalElement; scope.$on(''modal:open'', function(event, modalId) { if(modalId == null || currentModalId === modalId) { openModal(); } }); scope.$on(''modal:close'', function(event, modalId) { if(modalId == null || currentModalId === modalId) { closeModal(); } }); function openModal() { // always use raw template to prevent ng-repeat directive change previous layout modalElement = $(templateHtml); // create new inherited scope every time open modal modalScope = scope.$new(false); // link template to new inherited scope of modal $compile(modalElement)(modalScope); modalElement.on(''hidden.bs.modal'', function() { if(modalScope != null) { // destroy scope of modal every time close modal modalScope.$destroy(); } modalElement.remove(); }); modalElement.modal({ show: true, backdrop: ''static'' }); } function closeModal() { if(modalElement != null) { modalElement.modal(''hide''); } } }; });


La solución para este problema es crear un nuevo ámbito secundario. Todos los enlaces con alcance primario funcionan debido a la Herencia del alcance. Cuando necesito cambiar el contenido, simplemente destruyo el alcance del niño, evitando las pérdidas de memoria.

También he realizado métodos de obtención y configuración para el alcance secundario para evitar la contaminación del alcance principal, en caso de que el otro contenido utilice variables desechables.


Para eliminar manualmente el elemento haga un element.remove() . Parece que también quieres destruir el alcance de tu elemento compilado para que puedas hacer eso también haciendo scope.$destroy(); o $scope.$destroy(); Dependiendo de si estás en una directiva o no.

http://docs.angularjs.org/api/ng.$rootScope.Scope#$destroy