LINUX.ORG.RU

Управление директивами в AngularJS

 , , ,


0

1

Привет ангуляроразрабам. Посоветуйте как правильно сделать.

Есть контроллер, есть элемент в DOM. Нужно инициализировать плагин, передав ему этот элемент как параметр. Что-то типа такого:

var qr = new QCodeDecoder();
qr.decodeFromCamera(document.querySelector('video'), function() {});
Можно использовать директиву, но у плагина есть API и мне нужно его использовать.
qr.stop();

В итоге:

  • Делать document.querySelector('video') в контроллере — плохо.
  • Если инициализировать плагин из директивы, то я лишаюсь возможности использовать API плагина.

Как быть?

★★★★

Последнее исправление: Black_Roland (всего исправлений: 2)

Если инициализировать плагин из директивы, то я лишаюсь возможности использовать API плагина.

так используй API через директиву, передавай туда функции-колбеки через аттрибуты.

kelyar ★★★★★
()
Ответ на: комментарий от kelyar

Передавать в директиву легко, а мне надо в обратную сторону. Т.е. в директиве я могу сделать qr.stop() и у меня там этот самый qr есть, а мне надо добраться до qr из контроллера. Это не коллбеки, мне нужно вызывать функции в директиве.

Black_Roland ★★★★
() автор топика
Последнее исправление: Black_Roland (всего исправлений: 1)
Ответ на: комментарий от Black_Roland

Делай сервис, общайся через сервис.

zz ★★★★
()
Ответ на: комментарий от Black_Roland

мне надо добраться до qr из контроллера

если на странице гарантированно одна директива будет — работай через сервис; или же передавай директиве некоторый ключ, по которому будешь идентифицировать нужный объект в сервисе; или передавай директиве коллбэк из скоупа, в котором будешь возвращать необходимое АПИ.

static_lab ★★★★★
()

Делай сервис, общайся через сервис.
если на странице гарантированно одна директива будет — работай через сервис

zz, static_lab, будет одна. Но это же тоже неправильно, директив теоритически может быть больше одной. Костыли.

или передавай директиве коллбэк из скоупа, в котором будешь возвращать необходимое АПИ

Да тоже костыли.

Нашел еще такой вариант: https://thinkster.io/a-better-way-to-learn-angularjs/directives-talking-to-co... (еще где-то на SO натыкался). Здесь общение идет через scope: директива выполняет методы из скопа контроллера. Только не знаю что будет, если в контроллере не будет этого метода. И в итоге неочевидно какие методы дергает директива.

Black_Roland ★★★★
() автор топика
Последнее исправление: Black_Roland (всего исправлений: 2)
Ответ на: комментарий от Black_Roland

scope - это сервис, только с еще большим количество граблей. Можешь передавать инстанс сервиса, если не хочется плодить ключи.

zz ★★★★
()
Ответ на: комментарий от Black_Roland

Нашел еще такой вариант

уж лучше апи по коллбэку или хотя бы инициализация апи-объектом переменной в скоупе, чем так

static_lab ★★★★★
()

Понял. Сервис, так сервис :) Спасибо.

Black_Roland ★★★★
() автор топика

Ангулар - это набор экспериментов гугла и proof of concept, которые она почему то выдает за продукт.

[/thread]

EnterpriseMobility
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.