Подтвердить что ты не робот

Обратный вызов службы 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 page

{{mService.data.somedata}}

ПРОБЛЕМА:

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

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

4b9b3361

Ответ 1

Вы можете зависеть от $rootScope и обратиться в свою службу.

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;
        });
    });
}]);

Ответ 2

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

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

//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

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

Ответ 4

Если вы используете область в своей службе, это хороший показатель того, что вы нарушаете 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;
    });
  }
});