Подтвердить что ты не робот

Angular - Как удалить из DOM элемент, который я использовал $compile?

Мне нужна функциональность двух ng-views. Потому что я не могу изменить innerHTML что-то и скомпилировать его. Проблема в том, что когда я снова меняю содержимое, я могу скомпилировать, но angular удалить привязку на нем самостоятельно, или я должен сделать это вручную, если да, то как?

EDIT: Объяснение

Я хочу сделать модальный, содержимое которого я могу изменить и привязать к различным областям (следовательно, компиляция $). Но я не хочу уничтожать весь модальный, только часть его контента и переходить на другой. Мое главное сомнение заключается в том, что, удалив некоторый скомпилированный HTML, это может привести к утечкам памяти.

решаемые

Для этой проблемы я создал новую область с правами пользователя (с $new) и уничтожил ее всякий раз, когда менял контент. Спасибо за все

4b9b3361

Ответ 1

Решением этой проблемы является создание новой дочерней области. Все привязки с родительской областью работают из-за наложения Наследование. Когда мне нужно изменить содержимое, я просто уничтожаю область содержимого, избегая утечек памяти.

Я также создал методы getter и setter для дочерней области, чтобы избежать поляризации родительской оболочки, если в другом контенте используются одноразовые переменные

Ответ 2

Чтобы вручную удалить элемент, выполните element.remove(). Похоже, вы также хотите уничтожить область вашего скомпилированного элемента, чтобы вы могли сделать это, выполнив scope.$destroy(); или $scope.$destroy(); в зависимости от того, находитесь ли вы в директиве или нет.

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

Ответ 3

Спасибо за хорошее решение. Я только что опубликовал код реализации

.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');
            }
        }
    };
});