Ответ 1
Чтобы поддерживать надлежащее разделение проблем, вы не должны смешивать области. Не говоря уже о том, что будет сложно синхронизировать. Подводя итог: ваша директива не должна знать ничего о родительской области (или ее контроллере), и ваш контроллер не должен знать ничего о внутренней директиве. Они представляют собой отдельные компоненты в отдельных слоях.
Правильный способ связи между контроллером и директивой - это атрибуты директивы. В случае всплывающего окна, скажем, это можно сделать с помощью простого логического значения.
Контроллер и директива:
app.directive('popupbutton', [function() {
return {
restrict: "E",
scope: { isOpen: "=" },
template: '<a ng-click="isOpen = !isOpen">Toggle</a><div>Open? {{isOpen}}'
};
}]);
app.controller('MainCtrl', function($scope) {
$scope.isOpen = false;
});
И разметка:
<popupbutton is-open="isOpen"></popupbutton>
Этот метод не требует никакой логики, работает из коробки и поддерживает чистое разделение проблем. Здесь обновленный плункер: http://plnkr.co/edit/otIaGCLmiNdGcYEgi60f?p=preview