Я подготовил Plunkr, который предоставляет код:
https://plnkr.co/edit/WXtQxVcdgyvnaajbs4eJ?p=preview
Я назначил объект $ scope.menu.show в панели инструментов ControlCtrl, который контролирует, создано ли меню или нет.
<md-menu id="menu" ng-controller="toolbarCtrl" ng-if="true"> ...
Когда toolbarCtrl получает инициализацию, я могу контролировать, отображается ли меню, но я хотел бы управлять им с другого контроллера. В этом случае я создал две кнопки в mainCtrl, которые генерируют true или false, и я пытаюсь присвоить значение $ rootScope, но это не работает.
Как я могу это сделать?
ОБНОВЛЕНИЕ: Несмотря на то, что решение jtmingus отлично работает, я придумал другое решение, которое не требует событий.
Я создал этот заводской сервис:
app.factory('menuState', function () {
var state = {val: false};
function getState() {
return state;
}
function setState(newState) {
state.val = newState;
}
return {
getState: getState,
setState: setState
}
});
Затем на панели инструментов ControlCtrl я сначала скрываю меню
app.controller('toolbarCtrl', function($scope, menuState) {
// hide the menu
menuState.setState(false);
// pass the value to the menu
$scope.state = menuState.getState();
});
на mainCtrl я определяю щелчок кнопки следующим образом:
app.controller('mainCtrl', function($scope, $rootScope, menuState) {
$scope.state = menuState.setState;
});
и 2 кнопки на main.html
<md-button class="md-primary md-raised" ng-click="setState(true)">Show</md-button>
<md-button class="md-primary md-raised" ng-click="setState(false)">Hide</md-button>
То, как данные обычно должны использоваться совместно с контроллерами, - это использование службы. Поскольку вам нужны оба контроллера для просмотра того же состояния, вы можете использовать Angular events, в частности событие $on
.
Вот статья, в которой вы увидите, что несколько контроллеров смотрят одно и то же состояние:
https://variadic.me/posts/2013-10-15-share-state-between-controllers-in-angularjs.html
Edit: просмотрев эту статью, я понял, что это не лучшее объяснение, и в коде есть некоторые вещи, которые не работают. Например, если вы пытаетесь передать аргументы с помощью $broadcast
вызова $on
функции $on
требуются два параметра - события и аргументы.
На контроллере, с которого вы хотите начать показывать меню,
app
.controller('MainCtrl', ['$scope', function($scope) {
$scope.$broadcast('menu:show');
}])
.controller('ToolbarCtrl', ['$scope', function($scope) {
var ToolbarCtrl = this;
$scope.$on('menu:show', function() {
ToolbarCtrl.showMenu = true;
});
}])
В переключателе разметки, используя это значение
<md-menu id="menu" ng-controller="ToolbarCtrl" ng-if="ToolbarCtrl.showMenu"> ...