Передача контента через контроллеры - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь создать всплывающий компонент / директиву, которая позволяет транслируемому контенту появляться во всплывающем окне. Учитывая, что всплывающее окно должно отображаться над всем остальным содержимым и игнорировать любые атрибуты переполнения, имеет смысл, что оно находится на уровне документа (т. Е. В теге body).

Но я хотел бы иметь возможность указать содержимое всплывающего окна в любом компоненте на странице, например так:

<div class="custom-component">
    <header>Some component things</section>
    <popup show="$ctrl.onSomethingHover"> 
        <!-- More angular components here -->     
    </popup>
</div>

Однако, похоже, что включение таким образом не работает на вложенных контроллерах.

Вот как я предполагал, что это будет работать на уровне документа:

<body>
    <popup-wrapper ng-transclude="popup">
        <!-- The contents of <popup> should appear here -->
    </popup-wrapper>

    <div ui-view="content">
        <!-- Many layers of components in here -->
        <!-- A nested child component may wish to show a popup, so would include: -->
        <popup show="$ctrl.someLocalCondition">
               <h3>Hey, Nice Popup!</h3>
               <custom-directive></custom-directive>
               <custom-button></custom-button>
               <custom-map></custom-map>
        </popup>
    </div>
</body>

Когда я попробовал эту настройку, <popup>, который был указан во вложенном дочернем компоненте, не проецировался в <popup-wrapper>. Я могу только предположить, что включение включено для прямых потомков компонентов.

Я также пытался добавить элемент к телу во время фазы link (показано ниже). Это работало до некоторой степени, но, очевидно, не учитывало обновления через цикл дайджеста, поскольку затем оно было отделено от углового

.directive('popup', function () {
    return {
        restrict: 'E',
        controller: function () { },
        template:"<div class='popup-inner' ng-transclude></div>",
        transclude: true,
        link: function (scope, element) {
            angular.element('body').append(element);
        }
    };
})

Может кто-нибудь предложить какой-либо совет или решение этой проблемы?

Примечание: мне очень удобно, чтобы всплывающее окно отображалось в правильной позиции, я просто не уверен, как заставить работать трансклюкс / проекцию контента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...