2016-08-23 6 views
1

У меня есть контроллер страницы, упрощенным здесьДоступ родительский контроллер н уровни выше

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; 

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

Я слышал, как некоторые люди говорили о создании службы для этого, но похоже, что это будет сложно сделать в общем случае, и я не хочу, чтобы пользователям моей инфраструктуры приходилось создавать службу каждый раз, когда они помещали внутри себя панель вкладок, которая была бы безумной.

Итак, моя нынешняя идея - использовать области и написать функцию, которая будет пересекать родительские области, пока не найдет область, которую вы указываете, используя функцию сравнения. Я чувствую, что может быть лучший способ.

+0

Кто, черт возьми, голосует за вопрос, не разоблачая, что с ним не так? Я думал, что я объяснил это довольно хорошо, и это совершенно правильный вопрос. – jonhobbs

+0

так почему бы не создать сервис? Служба - отличное место для хранения данных или доступа к чему-то, что необходимо для более чем одного контроллера, директивы, фабрики, что угодно. Его в основном одноэлементный, вы вводите в нескольких местах, но его всегда один и тот же экземпляр, который вводится. Он очень прост в использовании и гораздо менее хрупкий, чем то, что вы имеете в виду ($ parent. $ Parent.n ..... data). Это также гораздо более проверяемо, если вы выполняете свои модульные тесты. – Igor

+0

Я был там, и я гарантирую, что нет ничего лучше службы, если вы хотите обмениваться информацией между контроллерами. Например: служба для хранения информации о пользователе 'infoService'. 'MainCtrl' может делать' infoService.registerUser ({name: 'David'}) ', а затем' subCtrl' может делать 'infoService.getLatestUser()' – pavlag

ответ

2

Так почему бы не создать услугу? Служба - отличное место для хранения данных или доступа к чему-то, что необходимо для более чем одного контроллера, директивы, фабрики, что угодно. Его в основном одноэлементный, вы вводите в нескольких местах, но его всегда один и тот же экземпляр, который вводится и создается только в первый раз, когда это необходимо. Он очень прост в использовании и гораздо менее хрупкий, чем то, что вы имеете в виду ($parent.$parent.n.....data). Это также гораздо более проверяемо, если вы выполняете свои модульные тесты.

var module = angular.module('app'); 

module.service('commonService', function() { 
    this.sharedData = {name: ''}; 
}); 

// assume this gets loaded first 
module.controller('MyCtrl1', ['commonService', function (commonService) { 
    commonService.sharedData.name = 'David' 
}]); 

// and this is loaded somewhere after MyCtrl2 
module.controller('MyCtrl2', ['commonService', function (commonService) { 
    var name = commonService.sharedData.name; 
}]); 

я не подтверждено синтаксис, но это базовая структура, очень просто.

+0

OK, так что мне нужно будет делать это каждый раз, когда у меня есть родительский сценарий grand-grand-parent> (буквально когда-либо страница в моем приложении с системой вкладок), или я смогу хранить их все в службе, например. служба может иметь карту пар ключевых значений, где каждый ключ является уникальным именем контроллера, и каждое значение является ссылкой на экземпляр контроллера? – jonhobbs

+0

@jonhobbs - сервис - это не что иное, как объект, созданный только один раз, чтобы он мог иметь все, что вы хотели, включая ссылки на контроллеры. В качестве правила ООП, хотя меньшие типы знают друг о друге, чем более гибкой программа, так это «свободная связь» всегда рекомендуется. Я бы отбросил общее/разделяемое состояние и общую/общую бизнес-логику в одну или несколько служб (или фабрик, если нет общего состояния), это лучший способ для «общения» между контроллерами. – Igor