Подтвердить что ты не робот

AngularJS GlobalCtrl vs $rootScope vs Service

Я запутался в нескольких вещах с помощью Globals в Angular. Ниже мой псевдо-код.

1) Так как у меня установлен мой GlobalCtrl, я могу ссылаться на мои $scope.modalOptions со всех моих контроллеров. В этом случае я в замешательстве, почему я вижу людей, добавляющих глобальные свойства в $rootScope вместо того, чтобы просто добавлять их, как я делаю здесь. Это на всякий случай, если они хотят ввести его в службу или что-то еще?

2) Должен ли я использовать службу вместо добавления свойств и методов в свой GlobalCtrl? Если да, то почему?

<div ng-app="app" ng-controller="GlobalCtrl">
    <div ng-view></div>
</div>

function GlobalCtrl($scope, $location) {
    $scope.modalOptions = {
        backdropFade: true,
        dialogFade: true
    };
}
4b9b3361

Ответ 1

Подход "Main Controller" определенно предпочтительнее использования $rootScope.

Наследование области есть, так почему бы не использовать его. На мой взгляд, это решение хорошо работает для большинства случаев, т.е. Если вам не нужен параллельный контроллер где-нибудь (это не было бы дочерним элементом Main). В этом случае лучше всего использовать сервис и при необходимости вводить его. Услуги (или, скорее, фабрики, потому что то, что вы, вероятно, будете использовать, - подробнее о них здесь) - это синглтоны и хорошо работают для обмена данными через контроллеры.

Важно знать о области

Наследование наследования в значительной степени является обычным наследованием JavaScript при игре. Вы должны использовать объекты для своих данных, потому что они передаются по ссылке.

Если у вас есть примитив типа $scope.myString = 'is of a primitive data type'; в родительском контроллере и попробуйте перезаписать значение в дочернем контроллере, результат не будет таким, каким вы ожидали бы - он создаст новую строку на дочернем контроллере вместо того, чтобы писать родительскому.

Предлагаемое чтение здесь

Заключительные мысли

Если вы используете подход вложенных контроллеров, не забудьте по-прежнему вставлять $scope (и другие зависимости) в дочерний контроллер. Это может работать без, но это медленнее и труднее проверить, и, наконец, не в последнюю очередь - неправильный способ сделать это.

Наконец, если у вас есть много переменных состояния, чтобы отслеживать и/или использовать много точек использования, определенно хорошая идея их извлечь в службу.

Ответ 2

Вообще говоря, глобальные переменные считаются плохой практикой, поскольку они не поощряют инкапсуляцию, затрудняют отладку и способствуют раздутому коду. Здесь хорошее обсуждение глобальных переменных: http://c2.com/cgi/wiki?GlobalVariablesAreBad.

Хорошим правилом является добавление свойств и методов в максимально возможную локальную область и использование сервисов для обмена данными между модулями.