Доброго времени суток.
Пишу приложение на AngularJS.
На backend NodeJS, обмен данными с сервером происходит исключительно через socket.io (кроме авторизации).
Интересует вопрос, как лучше построить архитектуру приложения на AngularJS, если например при обновлении какой то модели, когда я получаю данные с сервера мне нужно выводить различные Notification.
Ситуация следующая. В приложении есть методы обновления какой то модели, например проект. У проекта есть какие то поля, вроде названия, даты создания и массив людей которые в нем участвуют. Есть методы которые обновляют поля модели и есть отдельный метод который добавляет участников в проект, но этот метод по мимо этого еще и создает пользователя.
Я подвешиваюсь на событие, например projectUpdated. В случае если я изменил например название в каком то методе мне нужно написать пользователю что проект обновлен. А если я добавляю нового участника в проект, я также получаю событие projectUpdated, тк его генерирует тот же метод на сервере, но мне надо написать пользователю что участник добавлен. В этом никакой проблемы нет, но в данном случае я напишу пользователю 2 сообщения, и что проект обновлен и что участник добавлен.
Так вот проблема в чем, либо вообще отказаться от оповещения пользователя о таких вещах, ведь это и так отразится на представлении и он это визуально увидит, либо что то с этим придумать.
Вот вроде сумел сформировать свою мысль.
Upd: Генерировать разные события на "каждый чих" мне кажется как то неправильно. Или я ошибаюсь?
Если мы говорим только о том как сказать приложению что что-то случилось, например пришла какая-то нотификашка, то тут проще всего использовать события через $rootScope.
Насильно пихать изменения с сервера на клиент не очень удачная идея, лучше уведомить о том что что-то случилось а потом просто забрать данные запросом с клиента. То как вы организуете иерархию событий это уже ваше дело, это дело бэкэнда. Скажем событие вида ProjectUpdated не имеет смысла, так как не характеризует это событие. А вот MemberJoined это уже норм, можно наследовать по сути от ProjectUpdated и таким образом создавать какую-то иерархию. Но двух событий на одно действие действительно быть не должно, просто события должны быть осмысленными.
На клиент можно передавать просто событие, и добавлять его тип. Тогда листенер будет один а потом это все будет как-то разруливаться в приложении.
Ну и да, в идеале ваше приложение должно мало чего знать о том как работать с socket-io и как у вас вообще происходит взаимодействие с сервером, то есть все что всязано с отправкой/получением данных стоит инкапсулировать в сервисы.
Видимо я никак не отойду от привычных ajax запросов, пытаюсь выстроить взаимодействие аналогичным образом. А почему не стоит с сервера данные в событиях сразу отдавать на клиент?
DarkLynx91: ну как не стоит, просто сложнее будет и система будет более связанной. Скажем ну пришли данные с сервера, а вы как раз с ними работаете? Что делать? насильно обновлять? Если это просто список чего-то то ок, а если это отдельная запись? Много вопросов, которые решаются исходя из того что вы собственно делаете. Скажем если вы пишите какой-то многопользовательский редактор с большой интенсивностью изменений пользователями одного документа (как гуглодоки) то да, лучше пушить с сервера сразу и данные. Но это специфика задачи.
Вообще это реально очень непростой вопрос и слишком много чего может пойти не так. Поэтому мне больше нравится подход при котором с сервера нам приходит только нотификация о том что что-то поменялось и надо что-то делать, а уж мы потом что-то делаем. это упрощает и реализацию сервера и клиента, да и модель взаимодействия похожа на вариант с ajax, просто в качестве транспорта используется одно web-socket соединение.
А что посоветуете в данной ситуации. Есть функционал комментариев, ну например к тому же проекту. Когда на клиенте добавляется комментарий генерируется событие, например CommentAdded, на сервер передается ID проекта и объект комментария. На сервер стоит mongoDB и комментарии у проекта реализованы как вложенные документы со своим _id для удобного поиска (mongoose предоставляет поиск по вложенных документам по _id). Так вот вопрос, _id для нового комментария генерировать на клиенте и сразу отправлять его на сервер, или на сервере его присваивать и какии то образом потом обновить на клиенте?