Ответ 1
Подход "Main Controller" определенно предпочтительнее использования $rootScope.
Наследование области есть, так почему бы не использовать его. На мой взгляд, это решение хорошо работает для большинства случаев, т.е. Если вам не нужен параллельный контроллер где-нибудь (это не было бы дочерним элементом Main). В этом случае лучше всего использовать сервис и при необходимости вводить его. Услуги (или, скорее, фабрики, потому что то, что вы, вероятно, будете использовать, - подробнее о них здесь) - это синглтоны и хорошо работают для обмена данными через контроллеры.
Важно знать о области
Наследование наследования в значительной степени является обычным наследованием JavaScript при игре. Вы должны использовать объекты для своих данных, потому что они передаются по ссылке.
Если у вас есть примитив типа $scope.myString = 'is of a primitive data type';
в родительском контроллере и попробуйте перезаписать значение в дочернем контроллере, результат не будет таким, каким вы ожидали бы - он создаст новую строку на дочернем контроллере вместо того, чтобы писать родительскому.
Предлагаемое чтение здесь
Заключительные мысли
Если вы используете подход вложенных контроллеров, не забудьте по-прежнему вставлять $scope
(и другие зависимости) в дочерний контроллер. Это может работать без, но это медленнее и труднее проверить, и, наконец, не в последнюю очередь - неправильный способ сделать это.
Наконец, если у вас есть много переменных состояния, чтобы отслеживать и/или использовать много точек использования, определенно хорошая идея их извлечь в службу.