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

Просмотр значений в службе с контроллера

Я создал службу для изоляции бизнес-логики и ввел ее в контроллеры, которым нужна информация. В конечном итоге я хочу, чтобы контроллеры могли наблюдать за значениями в службе, чтобы мне не нужно было делать широковещательную рассылку или уведомление или сложное решение для передачи сообщений, чтобы все контроллеры были уведомлены об изменениях в данных в службы.

Я создал plnkr, демонстрирующий основную идею того, что я пытаюсь сделать.

http://plnkr.co/edit/oL6AhHq2BBeGCLhAHX0K?p=preview

Возможно ли, чтобы контроллер наблюдал значения услуги?

4b9b3361

Ответ 1

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

Вот ваше рабочее решение:

http://plnkr.co/edit/SgA0ztPVPxTkA0wfS1HU?p=preview

HTML

<!doctype html>
<html ng-app="plunker" >
<head>
  <meta charset="utf-8">
  <title>AngularJS Plunker</title>
  <script>document.write('<base href="' + document.location + '" />');</script>
  <link rel="stylesheet" href="style.css">
  <script src="http://code.angularjs.org/1.1.3/angular.js"></script>
  <script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
  <button ng-click="start()">Start Count</button>
  <button ng-click="stop()">Stop Count</button>
  ControllerData: {{controllerData}}
</body>
</html>

Javascript:

var app = angular.module('plunker', []);

app.service('myService', function($rootScope) {
  var data = 0;
  var id = 0;

  var increment = function() {
    data = data + 1;
    $rootScope.$apply();
    console.log("Incrementing data", data);
  };

  this.start = function() {
    id = setInterval(increment, 500) ;

  };

  this.stop = function() {
    clearInterval(id);
  };

  this.getData = function() { return data; };

}).controller('MainCtrl', function($scope, myService) {
  $scope.service = myService;
  $scope.controllerData = 0;

  $scope.start = function() {
    myService.start();
  };

  $scope.stop = function() {
    myService.stop();
  };

  $scope.$watch('service.getData()', function(newVal) {

    console.log("New Data", newVal);
    $scope.controllerData = newVal;
  });
});

Вот некоторые из пропущенных вами вещей:

  • Порядок переменных в $scope. $watch был неправильным. Его (newVal, oldVal), а не наоборот.
  • Поскольку вы работали с setInterval, который является асинхронной операцией, вам нужно позволить angular знать, что все изменилось. Вот почему вам нужен $rootScope. $Apply.
  • Вы не можете смотреть функцию, но можете посмотреть, что возвращает функция.