В чем (технически) разница между управлением состоянием и использованием $rootScope в AngularJS?

Я много использовал AngularJS и часто читал: «Не злоупотребляйте $rootScope, это плохая практика».

Затем, когда React придумал шаблон Flux, для всех данных было одно центральное место, которое запомнилось мне в $rootScope.

Если бы я использовал объект $rootScope как единственный источник правды, в чем была бы разница с другими подходами, такими как Flux?

Я имею в виду, что вы также можете просто использовать $rootScope для организации данных, например, $rootScope.loggedInUser, $rootScope.userList и так далее. И вы могли бы создать службу, в которой будут выполняться все изменения $rootScope, чтобы вы знали, где искать, когда что-то происходит.

Было бы неплохо, если бы кто-нибудь мог объяснить, почему это не было бы хорошей идеей (или сказать мне, что в принципе все в порядке. Я открыт) :)

Изменить: Связанный вопрос не отвечает на вопрос о разнице шаблонов $ rootScope и Flux.


person EscapeNetscape    schedule 10.07.2018    source источник
comment
Что ж, вместо того, чтобы назначать множество свойств $rootScope, вам лучше хранить данные в service. Затем внедрить эту службу вместо внедрения файла $rootScope.   -  person Red    schedule 10.07.2018


Ответы (1)


Почему чрезмерное использование $rootScope является плохой практикой?

Примеры, которые вы приводите, лучше хранить внутри service или factory.

Таким образом, вы можете организовать все данные и вводить правильные данные, когда это необходимо.

Сохраняя такие свойства внутри $rootScope, вы получаете огромный объект, содержащий всевозможные данные. Что делает его очень трудно поддерживать, если проект становится больше.

При правильном проектировании приложения вам даже не понадобится файл $rootScope.

Конечно, вы можете хранить все внутри $rootScope, но вы усложняете себе и своим коллегам поддержку приложения. И обратите внимание, что каждая переменная, установленная в $rootScope, доступна контроллеру $scope через прототипное наследование.

введите здесь описание изображения

На картинке выше console.log($scope). Как видите, данные $rootScope также доступны там.

Хранение простых вещей внутри $rootScope иногда, конечно, может быть удобно. Но я не могу понять, какую вещь я бы присвоил $rootScope. Желательно хранить его внутри services.

person Red    schedule 10.07.2018
comment
И обратите внимание, что каждый $scope также имеет копию $rootScope. --- НЕТ - person Petr Averyanov; 10.07.2018
comment
@PetrAveryanov да, обновил - person Red; 10.07.2018