Как правильно связать сервисы объектами для которых он создается?

Опять... Переопределил я директиву и понял, что теперь мне хочется добавить управление (пауза-плей).
И вот теперь я рассматриваю эту директиву, как часть или даже основную часть объекта-компонента video-bg-player.
И ещё я захотел на кнопки повесить анимацию и сделать их при помощи самого angular и его анимации ( это пока, а потом возможно что-то посильнее придется тянуть). И вот вроде такая мелочь, как анимация все и поломала.
Если перейти в ооп измерение и поставить себе цель сделать легко поддерживаемое и расширяемое приложение, то первое что приходит в голову, это инициализация в одном месте и инжектор. Далее понимаешь, что "мой мега плеер" это одна большая "MainVideoBgView", которая и расставляет сам плеер и его кнопочки по нужным местам, которые она либо сама и создает, либо в неё инжектят, ну или берет их из ассет-манагера. Теперь начинаю понимать, что кнопка это объект, который я передаю в класс, который будет её анимировать по вызову метода play. Как я его туда передаю? Ну тут только два способа либо инжектю из места где собираю все приложение, либо мое главное представление, которое так же может являться местом инициализации, передает в класс анимации объект кнопку при его создании.

Все просто, но с angular все немного сложнее. Здесь mainView является директива, а кнопка вообще по сути не является объектом который будет создаваться ею и тем более её (кнопку) нельзя инжектировать.
Можно создать сервис для анимации и в него передать сервис $document и уже самому там искать то что нужно, но это совершенно не правильно. Есть ещё другой вариант, что директива передаст ссылку на кнопку в этот сервис, но это хоть и правильно, но выглядит убого и некрасиво. Некрасиво в плане что сервис стоит и ждет пока в него кнопку передадут, а потом ещё несколько сервисов нужно писать которые будут проверять, а есть ли эта кнопка или нет. Можно и не проверять, но это будет неправильно.

Но есть способ, когда директива будет играть роль настоящего MainView и передаст не в сервис, а уже в обычный класс при его создании в своем чреве, кнопку полученную из своей скопы, а не лазая и ища по чужим.

Но как это с точки зрения angular, ведь придется не только кнопку передавать, но ещё и $animate и прочее?
Или я не могу приспособится к angular и есть другой способ? Вот как бы Вы сделали тоже самое?
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
нельзя инжектировать.

можно, ng-transclude вам в помощь.

$document и уже самому там искать то что нужно

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

В идеальном мире ваша директива делалась бы примерно так:

<x-video-bg-container type="youtube" video-id="{{my.videoID}}">
    <h1>Headline</h1>
    <x-video-bg-controls></x-video-bg-controls>
</x-video-bg-container>


Далее магия ng-transclude и общение через контроллер директивы, что позволяет нам реализовать свои контролы и т.д. Так же можно реализовать делегаты для директивы через сервисы или через колбэки директив.... Как пример - можете посмотреть как это реализовано в ionic framework (UI фреймворк для мобильных приложений на angular)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы