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

$ смотреть внутри службы?

Можно ли настроить $watch в массиве объектов внутри службы (я бы хотел, чтобы объявление $watch было внутри службы)?

4b9b3361

Ответ 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.

Я могу предоставить вам реальный код, если вы уточните сценарии.