AngularJS – почему моя переменная области видимости не обновляется при вызове $on?

В моем основном контроллере приложения я вызываю этот асинхронный метод, который передает событие по завершении (loadData). В обработчике событий я загружаю некоторые данные в свой массив $scope.layers. Но на мой взгляд ничего не показано.

Событие запускается, и данные заносятся в массив слоев.

Это вид:

<div ng-repeat="layer in layers track by $index">
     <span>{{layer.name}}</span>
</div>

это мой контроллер

app.controller('MainPanelCtrl',['$scope', 'myService', function($scope, myService){
'use strict';

myService.loadData();

$scope.$on('loadDoneEvent', function () {
    $scope.layers = myService.getLayers();
    //$scope.$apply() // why when adding this its working?
});}]);

Это сервис:

app.factory('myService', ['$rootScope', '$http', function ($rootScope, $http) {
    'use strict';
     var data;

    var loadData = function (compId) {
        $http.get("someUrl").then(function (response) {
            data = response.data;
            $rootScope.$broadcast('loadDoneEvent');
        });
    };
  return {
           loadData : loadData 
        };
    }]);

Я просто не могу понять, чего мне здесь не хватает...

Я знаю, что могу использовать обещания, и это сработает. Но я хочу иметь возможность вызывать эту функцию loadData более одного раза и чтобы мои различные компоненты пользовательского интерфейса реагировали. Не уверен, что смогу получить это обещаниями.

Я нашел эту ссылку и у него это работает, так что я просто не могу понять, почему это не работает у меня...


person Tamar Cohen    schedule 07.03.2017    source источник
comment
зачем вы транслируете данные из сервиса? Было бы лучше вернуть обещание, а затем в обратном вызове обновить свой массив   -  person Gonzalo.-    schedule 07.03.2017
comment
Кроме того, вы можете проверить это stackoverflow.com/questions/35951408/ и этот stackoverflow.com/questions/29849293/   -  person Gonzalo.-    schedule 07.03.2017
comment
Не могли бы вы показать нам, как работает myService.loadData()? В нынешнем виде этот код никогда не будет работать, потому что вы на самом деле не используете $scope.$broadcast или $scope.$emit в том, что вы показали.   -  person Jon Black    schedule 08.03.2017
comment
Я думаю, что он внедряет $rootScope в сервис и использует $broadcast, что я не рекомендую.   -  person Gonzalo.-    schedule 08.03.2017