Управление нг-если с другого контроллера

0

Я подготовил 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>
Теги:

2 ответа

1
Лучший ответ

То, как данные обычно должны использоваться совместно с контроллерами, - это использование службы. Поскольку вам нужны оба контроллера для просмотра того же состояния, вы можете использовать Angular events, в частности событие $on.

Вот статья, в которой вы увидите, что несколько контроллеров смотрят одно и то же состояние:

https://variadic.me/posts/2013-10-15-share-state-between-controllers-in-angularjs.html

Edit: просмотрев эту статью, я понял, что это не лучшее объяснение, и в коде есть некоторые вещи, которые не работают. Например, если вы пытаетесь передать аргументы с помощью $broadcast вызова $on функции $on требуются два параметра - события и аргументы.

  • 0
    Я добавил Plunkr plnkr.co/edit/WXtQxVcdgyvnaajbs4eJ?p=preview со службой, но, похоже, переменная службы не обновляет область контроллера. Можешь посмотреть?
  • 0
    @DittmarConsulting Вам нужно добавить Angular события. Один контроллер не может знать, что переменная службы обновляется без них. Если вы прочитаете статью, которой я поделился, вы поймете, как это сделать. Это супер ясно и легко следовать
Показать ещё 7 комментариев
1

На контроллере, с которого вы хотите начать показывать меню,

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"> ...
  • 0
    Я обновил свой Plunkr предложением, которое вы предоставили, но оно не сработало. Посмотрите здесь plnkr.co/edit/WXtQxVcdgyvnaajbs4eJ?p=preview

Ещё вопросы

Сообщество Overcoder
Наверх
Меню