21

私が必要としているのは、2 つの ng-views の機能です。できないので、何かのinnerHTMLを変更してコンパイルしたいです。私が抱えている問題は、コンテンツを再度変更するとコンパイルできますが、angular はそれ自体でバインディングを削除しますか、それとも手動で行う必要がありますか?

編集:説明

モーダルを作成したいのですが、そのコンテンツを変更してさまざまなスコープにバインドできます (したがって、$compile)。しかし、モーダル全体を破壊するのではなく、そのコンテンツの一部だけを破壊して、別のモーダルに変更したくありません。私の主な疑問は、コンパイルされた HTML を削除することで、メモリ リークが発生する可能性があるかどうかです。

解決した

この問題のために、新しい子スコープを ($new で) 作成し、コンテンツを変更するたびに破棄しました。すべてに感謝

4

3 に答える 3

20

要素を手動で削除するには、element.remove(). コンパイルされた要素のスコープも破棄したいように聞こえるので、ディレクティブにいるかどうかに応じて、scope.$destroy();またはそれに応じてそれを行うことができます。$scope.$destroy();

http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$destroy

于 2013-05-28T20:26:46.640 に答える
9

良い解決策をありがとう。実装コードをいくつか投稿しました

.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');
            }
        }
    };
});
于 2014-06-05T15:53:19.380 に答える