У меня есть контроллер страницы, упрощенным здесьДоступ родительский контроллер н уровни выше
angular.module('app').controller('MyCtrl', function() {
this.name = 'David'
});
Я использую синтаксис controllerAs в моем шаблоне (MyCtrl, как основной), так что я просто использовать main.name в моем шаблон для доступа к имени. Все хорошо.
В моем шаблоне у меня есть множество вложенных директив, которые создают новые области, а где-то внизу. У меня есть ng = controller = "SubCtrl as subController". Теперь я могу получить доступ к свойствам на субконтроллере, выполнив subcontroller.property, и в пределах этого шаблона я все еще могу получить доступ к main.name, потому что controllerAs является удивительным.
Проблема в том, что в моем втором коде контроллера мне нужно получить доступ к вещам в родительском контроллере, который к этому моменту имеет n уровней. Я знаю, что могу это сделать, как это в главном контроллере ...
$scope.main = this;
, а затем делать это во втором контроллере
var main = $scope.$parent.$parent.$parent.$parent.main;
, но все мы знаем, что мы не должны делать это, и я выиграл В любом случае, я знаю, сколько уровней в глубине, потому что я не знаю, сколько директив, которые разработчик разместил внутри, создают новую область.
Я слышал, как некоторые люди говорили о создании службы для этого, но похоже, что это будет сложно сделать в общем случае, и я не хочу, чтобы пользователям моей инфраструктуры приходилось создавать службу каждый раз, когда они помещали внутри себя панель вкладок, которая была бы безумной.
Итак, моя нынешняя идея - использовать области и написать функцию, которая будет пересекать родительские области, пока не найдет область, которую вы указываете, используя функцию сравнения. Я чувствую, что может быть лучший способ.
Кто, черт возьми, голосует за вопрос, не разоблачая, что с ним не так? Я думал, что я объяснил это довольно хорошо, и это совершенно правильный вопрос. – jonhobbs
так почему бы не создать сервис? Служба - отличное место для хранения данных или доступа к чему-то, что необходимо для более чем одного контроллера, директивы, фабрики, что угодно. Его в основном одноэлементный, вы вводите в нескольких местах, но его всегда один и тот же экземпляр, который вводится. Он очень прост в использовании и гораздо менее хрупкий, чем то, что вы имеете в виду ($ parent. $ Parent.n ..... data). Это также гораздо более проверяемо, если вы выполняете свои модульные тесты. – Igor
Я был там, и я гарантирую, что нет ничего лучше службы, если вы хотите обмениваться информацией между контроллерами. Например: служба для хранения информации о пользователе 'infoService'. 'MainCtrl' может делать' infoService.registerUser ({name: 'David'}) ', а затем' subCtrl' может делать 'infoService.getLatestUser()' – pavlag