Как я могу передавать данные из основного контроллера для просмотра контроллера в angular?

Я хочу создать приложение в angular.

У меня есть основной контроллер вне представления и специальный контроллер для представления.

Как я могу передавать данные из главного контроллера в контроллер представления (домашнего контроллера)?

Я хочу выполнить функцию в контроллере представления после отправки данных из главного контроллера.

Я пытался использовать - $emit и $on, но в моем случае это не работает.

Например, мой код: https://jsfiddle.net/32hb3odk/7/

Index.html

<div ng-app="myApp">

 <div class="head-part" ng-controller="MainController as main">
 <h1>Header</h1>
 <input ng-click="main.EmitData()" type="button" value="Emit data to child control" />
 <br /> <br />
 </div>

  <div class="view-part">
  <h2>View:
  </h2>
  <div ng-view></div>
</div>


<script type=text/ng-template id=home.html>   
<div>{{home.title}}</div>
</script>

</div>

JavaScript:

angular.module('myApp', ['ngRoute'])
.config(['$routeProvider', function ($routeProvider) {

        $routeProvider
            .when('/', {
                controller: 'HomeController',
                controllerAs: 'home',
              templateUrl: 'home.html'
            })
                        .otherwise('/');
    }]);

angular.module('myApp').controller('HomeController', ['$scope',function ($scope) {
        var vm = this;
        vm.title = 'Homepage';
    $scope.$on('EmitMain', function(){
        alert("GetDataFromMainController");
    });
    }]);

  angular.module('myApp').controller('MainController', ['$scope', function ($scope) {

        var vm = this;
        vm.EmitData = function(){
      $scope.$emit('EmitMain');
    }

    }]);

person Jenan    schedule 15.12.2015    source источник
comment
Мне не на чем основываться, но в большинстве случаев, когда люди задают вопросы о передаче данных с одного контроллера на другой, они должны использовать службу. Итак, объясните, почему вы считаете, что вам не стоит пользоваться сервисом?   -  person Pjetr    schedule 15.12.2015
comment
@Pjetr Потому что мне нужен был индикатор действия, не передающего данные через службу.   -  person Jenan    schedule 31.12.2015
comment
не было бы больше смысла, если бы служба, обрабатывающая действие, передала бы индикатор действия, а не при нажатии кнопки? <div ng-if="dataService.isBusy"><i class="loading"></i></div>.   -  person Pjetr    schedule 07.01.2016


Ответы (1)


Это потому, что $emit поднимается по дереву. Вместо этого используйте $broadcast, так как он проходит по дереву вниз.

person Adrian Neatu    schedule 15.12.2015
comment
Я попробовал $broadcast в этом образце, и он не работает. - person Jenan; 15.12.2015
comment
@Jenan $scope.$broadcast вместо $scope.$emit? - person Adrian Neatu; 15.12.2015
comment
Хммм, является ли div ng-view дочерним элементом div mainController? если они на самом деле родные, вам придется использовать $rootScope.$on и $scope.$emit. Если вы это делаете, я думаю, что это нарушает логику mainController. - person Adrian Neatu; 15.12.2015
comment
Вот обновленная скрипта: jsfiddle.net/32hb3odk/9 Пожалуйста, сделайте правильный отступ в HTML и имейте в виду что $emit и $broadcast всегда проходят по дереву DOM из того места, где вы их запускаете. Если элементы одноуровневые, вам нужен другой подход, например, использование $rootScope. - person Adrian Neatu; 15.12.2015
comment
Хорошо, спасибо за исправление моего образца. Теперь это работает отлично! :) - person Jenan; 15.12.2015