it-roy-ru.com

Обратный вызов службы Angularjs для обновления области контроллера

Сервис с функцией обратного вызова сторонней библиотеки:

mbAppModule.service('aService', function ($http) {
    this.data={"somedata":0};
    var m3rdPartLib="init";  // init    
    m3rdPartLib.on('timeupdate', function() {
        this.data.somedata=1;
    });
}

И контроллер

mbAppModule.controller({
    MController: function ($scope, $http, mService) {
        $scope.mService= mService;    
    });
});

hTML-страница

{{mService.data.somedata}}

ПРОБЛЕМА:

m3rdPartLib.on () - это функция обратного вызова сторонней библиотеки, которую я использую в службе. Я хочу показать его в пользовательском интерфейсе по мере его обновления. При обратном вызове значение изменяется, но не отражается на пользовательском интерфейсе.

Прочитайте несколько документов и найдите, что $ rootScope. $ Apply может быть вызван, но у меня нет ссылки на $ scope/$ rootScope в сервисе.

21
andNn

Вы можете получить зависимость от $rootScope и вызвать apply в вашем сервисе.

mbAppModule.service('aService', ["$http", "$rootScope", function ($http, $rootScope) {
    this.data = {
        "somedata": 0
    };
    var m3rdPartLib = "init"; // init    
    m3rdPartLib.on('timeupdate', function () {
        $rootScope.$apply(function(){
            this.data.somedata = 1;
        });
    });
}]);
26
Mark Coleman

Мне нужно было обновить поле ввода из службы, потому что у него были прослушиватели, а что-то другое меняло данные случайным и динамическим образом.

Это также можно использовать для вызова функций контекста в контроллере:

//scope will be set to current scope of a controller
//which has an ng-view containing this element    
var scope = angular.element('#input-element').scope();
//wrap changes in an apply call to make sure view and model are consistent
scope.$apply(function() {
    scope.object.data = value;
});

Благодаря этому сообщению: Как мне получить доступ к переменной $ scope в консоли браузера с помощью AngularJS?

3
mattdlockyer

Если вы используете область в своем сервисе, то это хороший показатель того, что вы нарушаете SRP, потому что ваш сервис должен получать данные только на ваш контроллер .. Я предлагаю вам сделать что-то подобное.

mbAppModule.service('aService', ["$http", "$rootScope", function ($http, $rootScope) {
  this.data = {
    "somedata": 0
  };
  var m3rdPartLib = "init"; // init    
  this.GetPartLib = function () { 
    return m3rdPartLib;
  }
}]);

mbAppModule.controller({
  MController: function ($scope, $http, mService) {
  this.GetPartLib = function (){ 
    mService.on('timeupdate', function() {
     this.data.somedata=1;
    });
  }
});
0
Andre L.A.C Bittencourt

Используйте функцию $scope.$watch. Посмотрите на мой jsfiddle . У меня нет вашей библиотеки, поэтому я только симулирую ее - значение меняется с 0 на 1 через 5 секунд.

0
mchrobok