2016-02-22 5 views
3

Я работаю над небольшим приложением в AngularJS. Мой проект содержит файл Body.html, которые содержат 3 вида: SideMenu, Заголовок и Содержимое, каждый с каждым собственным контроллером и MainController как есть родитель - контроллер в Body.html.
Может ли контроллер заголовка изменить свойство в боковом меню - статус открытия/закрытия бокового меню. И может ли контроллер бокового меню изменять свойство в заголовке - текст заголовка.
Я могу использовать главный контроллер, поскольку как контроллер заголовка, так и контроллер бокового меню могут ссылаться на главный контроллер. Но данные не будут состоять. Обновление данных с 1-го контроллера не влияет на данные во втором контроллере (без использования $ watch).

Могут ли как контроллер бокового меню, так и контроллер заголовка (диспетчер сиблинга) взаимодействовать друг с другом? без помощи родителя?Can Siblings Controllers взаимодействуют друг с другом без помощи родителя - AngularJS


Body.html

<div> 
    <!-- Header placeholder --> 
    <div ui-view="header"></div> 

    <!-- SideMenu placeholder --> 
    <div ui-view="sideMenu"></div> 

    <!-- Content placeholder --> 
    <div ui-view></div> 
</div> 

header.html

<div> 
    {{ headerCtrl.text }} 
</div> 
<div ng-click="headerCtrl.openSideMenu()"> 
    --Open-- 
</div> 

HeaderController.js

// sideMenuCtrl = ??? 
headerCtrl.text = "Title"; 
headerCtrl.openSideMenu = function() 
{ 
    sideMenuCtrl.isSideMenuOpen = true; 
}; 

SideMenu.html

<div ng-class={ 'side-menu-open': sideMenuCtrl.isSideMenuOpen }> 

    <div ng-repeat="menuItem in sideMenuCtrl.sideMenuItems" 
      ng-click="sideMenuCtrl.selectMenuItem(menuItem)"> 
      {{ menuItem.text }} 
    </div> 
</div> 

SideMenuController.js

// headerCtrl = ??? 
sideMenuCtrl.selectMenuItem = function(menuItem) 
{ 
    headerCtrl.text = menuItem.text; 
} 
+0

Вы можете использовать услугу или фабрику для обмена данными и логики между контроллерами. См. Угловую документацию и руководство по [услуге] (https://docs.angularjs.org/guide/services) и [заводская установка] (https://docs.angularjs.org/guide/providers) – zoom

+0

redux/flux является хорошим шаблон для потока данных сверху вниз для всех братьев и потомков.или, в более общем плане, EventEmitters или DOM-события для существующего родителя (события пузырятся). глобальная переменная (ужас) может работать с упрощенными чудесами в небольших приложениях. – dandavis

+0

A может использовать сервисы/фабрики для обмена данными между контроллерами. Но у меня была бы такая же проблема, как использование родительской области - данные не состоят. Мне нужно будет использовать $ watch и слушать изменение данных в каждом контроллере. Могу ли я сделать это без $ watch? –

ответ

4

Как указано в моем комментарии, вы можете использовать услугу AngularJS поделиться некоторыми данными между контроллерами.

app.service('AppContextService', function(){ 
    this.context = { 
     isSideMenuOpen: false 
    }; 
}); 

app.controller('SideMenuCtrl', ['$scope', 'AppContextService', function($scope, AppContextService) { 
    // exposing the application context object to the controller. 
    $scope.appContext = AppContextService.context; 
}]); 

app.controller('HeaderCtrl', ['$scope', 'AppContextService', function($scope, AppContextService) { 
    $scope.appContext = AppContextService.context; 
    $scope.openSideMenu = function() 
    { 
     $scope.appContext.isSideMenuOpen = true; 
    }; 
}]); 

Затем адаптируйте HTML для использования вашего общего объекта appContext.

<div ng-class={ 'side-menu-open': appContext.isSideMenuOpen }> 
    [...] 
</div> 

Вот рабочая скрипку, которая иллюстрирует проблему: fiddle

Этот ответ охватывает использование service, чтобы соответствовать вашим потребностям, но я уверен, что есть и другие (и, возможно, лучше) способов решения проблема, которая может включать в себя другие функции Angular, или даже некоторые общие рефакторинг приложений.

копнуть немного глубже, это ТАК тема может быть хорошим началом: difference between service, factory and providers

 Смежные вопросы

  • Нет связанных вопросов^_^