У меня есть большой комплекс AngularJS Comet application («в режиме реального времени»). Клиенты отправляют данные на сервер, а также получают уведомления с сервера о событиях, которые инициировали другие пользователи.AngularJS Comet («в реальном времени») приложение двухсторонняя межмодульная связь
В своей простейшей форме, приложение имеет следующие клиентские компоненты ("Service" ниже может быть AngularJS .Service или .factory, независимо)
[Object] Controller
: может быть любой объект, какStudent
,Teacher
,Lesson
,Document
[Object] Service
: удерживает модель объекта и имеет методы для работы с этими даннымиSocket Service
: обертка для библиотеки сокета
Вызовы могут идти в обоих направлениях
- Пользователь Обновления Что-то>
[Object] Controller
>[Object] Service
>Socket Service
> Сервер - Сервер>
Socket Service
>[Object] Service
>[Object] Controller
> Пользователь Заявленный
Что является лучшим архитектура для двусторонней межмодульной связи в этом случае?
Вот что я думаю о вариантах. Пожалуйста, предложите другие хорошие, если я их оставил.
- Используйте circular dependency fudge. Всюду, где я читал, кажется, что мы не должны этого делать, включая Lu4 в его «выдумке». С другой стороны, это означает, что вы можете иметь вызовы методов в обоих направлениях, поддерживая межмодульную связь во всем приложении.
- Используйте инъекции зависимостей и вызовы методов в одном направлении и события в другом направлении. Есть someopposition событиям с чрезмерным использованием. Это случай чрезмерного использования?
- Используйте события в обоих направлениях. Подходит ближе к «чрезмерному использованию», но поддерживает взаимодействие между модулями в приложении.
- Используйте Mediator pattern, т. Е. Иметь центральное устройство для координации, которое координирует в обоих направлениях. Я не уверен, как это отличается или лучше, чем использование событий, в которых $ rootScope становится «посредником», против которого регистрируются все события и их обратные вызовы.
- Какая-то длительного опроса между модулями, так что, например,
[Object] Controller
делает вызов[Object] Service
, который возвращает обещание и в свою очередь, вызываетSocket Service
, который также возвращает обещание, и когдаSocket Service
получает некоторые данные, обещание устраняющее назад вверх по цепи, после чего[Object] Controller
инициирует другой запрос.
«Получение обновления с сервера для чего-либо в вашем клиентском приложении находится в самом определении события». Но так же как и пользовательские события, поэтому «$ (« # clickme »). On (« click », ...' в jQuery и т. Д. Почему использование событий по всему не «чистое»? Это проще. – poshest
Я бы не стал согласны с тем, что события в любом случае проще. На самом деле, IMHO, одна из основных причин использования угловых, - это двусторонние привязки, но их нужно настраивать с помощью контроллера. Угловой предоставляет только концепцию контроллеров для просмотров с использованием ' $ scope', поскольку AFAIK не предоставляет какой-либо модельный контроллер, который мог бы использоваться для привязки моделей к источникам данных, которые испускают события. Это хорошо, так как большинство веб-приложений по очереди основаны. («$ HTTP'- сервис делает хорошую работу, скрывая «готовые» или «неудачные» события, которые принципиально отличаются от событий, которые могут появиться в любое время.) –
AngularJS не предоставляет «модельный контроллер, который может использоваться для привязки моделей к источникам данных» и я не предлагаю отказаться от двухсторонних привязок. Но представьте себе вызов $ scope.addNewT eacher', который вместо того, чтобы делать версию сокетов '$ http', которая возвращает обещания и все, просто выдает событие, то же самое событие, которое может быть выпущено службой Socket, если новый Учитель пришел с сервера. Не нужно писать две разные функции addNewTeacher, которые полагаются на совершенно разные технологии. – poshest