Скука и рутина это зло

run{}

В AngularJS должно быть больше структуры

Angular.js – каркас для создания сложной клиентской части, как правило SPA (Single Page Application). В этом каркасе есть несколько сущностей, вроде controllers, directives, services, factories, provides, filters. С их помощью можно разбить код на независимые части.

Я освоил этот каркас довольно быстро – где-то около недели, и смотрю на него глазами опытного Rails-разработчика. И многое мне не нравится.

Rails очень хорош своей навязываемой структурой приложения – любой новый разработчик пришедший в проект уже приблизительно знает где какой код искать, где что писать. Это и есть Convention over Configuration.

В Angular есть необходимые абстракции, но нет convention. Правила именования директорий, файлов, сервисов это важно, но не это меня сейчас беспокоит. Есть множество вопросов на которые официальная документация ответов не даёт.

Где хранить состояние?

В Angular есть такая сущность как scope. Это пространство имён которым владеет controller либо directive, которое может иметь предков (parent scope). Именно через это проиходит two way binding, связь представления (view) и controller/directive.

Кроме того, есть такая вещь как $rootScope, которая выступает в роли глобальной области видимости, доступной из всех views, controllers, directives, factories.

Проблемы начинаются когда у вас появляется много разных controllers, direcrtives, которым нужно общаться между собой и обмениваться данными. Первая же мысль использовать для этого $rootScope, приносит боль, много боли.

Вторая мысль – использовать service. Сервис – это набор методов, которые владеют общим состоянием. Однако это состояние не глобально, для каждого контроллера и директивы при использовании создаётся отдельный экземпляр сервиса.

Я решил эту проблему с помощью пары событий между контроллерами. Первый контроллер запрашивает данные second:get, а второй отправляет second:get:error либо second:get:success. Очень не хватает каналов из Go.

Есть ещё ряд проблем, для которых я пока не придумал грамотного решения.

Comments