Обратный вызов службы 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 в службе.
Ответы
Ответ 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;
});
}
});