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.