Можно ли настроить $watch
в массиве объектов внутри службы (я бы хотел, чтобы объявление $watch
было внутри службы)?
$ смотреть внутри службы?
Ответ 1
Вы можете добавить любое выражение в набор часов, введя $rootScope
и используя функцию, первый аргумент метода $watch
. Псевдо-код:
$rootScope.$watch(function() {
return //value to be watched;
}, function watchCallback(newValue, oldValue) {
//react on value change here
});
Не забывайте о третьем, логическом аргументе метода $watch
. Вам нужно указать true
, если вы хотите глубоко просмотреть весь объект для изменений.
Ответ 2
Услугипо самой своей природе подобны классам и домашним методам. Вы можете настроить метод, который вы вызываете у своего контроллера, аргументом которого является область действия и применяет выражение часов:
app.service('myservice',function(){
this.listen = function($scope) {
$scope.$watch(function(){return someScopeValue},function(){
//$scope.dosomestuff();
});
}
});
//your controller
function myCtrl($scope,myservice) {
$scope.listen = function() {
myservice.listen($scope);
}
//call your method
$scope.listen();
}
update: если вы пытаетесь посмотреть приватную локальную переменную внутри службы, см. принятый ответ с помощью $rootScope. Если вы пытаетесь $смотреть переменную $scope в локальной области, то это лучший вариант. Они достигают двух очень разных вещей.
Ответ 3
Можете ли вы уточнить, чего вы хотите достичь? Насколько я понимаю, вы получаете массив объектов с сервера в качестве своей модели. Тогда это не понятно:
- Вы хотите проверить, были ли изменены некоторые объекты в массиве (может быть, с момента последнего вызова сервера на случай, если вы повторяетесь Пулы)?
- Вы хотите проверить, были ли какие-то объекты в массиве изменены пользователем через некоторые элементы управления переднего плана?
В случае 1 вам действительно не нужно использовать $watch (или, скорее, $watchCollection), но вы должны перебирать массив, полученный с сервера, и проверять изменения (то же самое, что и $watchColleciton). Если объект отличается от объекта, который вы сейчас используете, вы вызываете объект. $Save() для этого элемента.
В случае 2 используйте $watchCollection() в области $, переданной как параметр вашей служебной функции, или используйте $rootScope, если вы держите свой массив в $rootScope.
Я могу предоставить вам реальный код, если вы уточните сценарии.