Как сохранить данные обслуживания одинаково на нескольких контроллерах без использования $watch?

Там более старый ответ, который я увидел здесь на S.O, который гласит:

"Этот JavaScript работает, поскольку мы передаем объект обратно из а не стоимость. Когда объект JavaScript возвращается из служба Angular добавляет часы во все свои свойства.

Затем он приводит этот пример:

JavaScript:

angular.module("Demo", [])
    .factory("DemoService", function($timeout) {

        function DemoService() {
            var self = this;
            self.name = "Demo Service";

            self.count = 0;

            self.counter = function(){
                self.count++;
                $timeout(self.counter, 1000);
            }

            self.addOneHundred = function(){
                self.count+=100;
            }

            self.counter();
        }

        return new DemoService();

    })
    .controller("DemoController", function($scope, DemoService) {

        $scope.service = DemoService;

        $scope.minusOneHundred = function() {
            DemoService.count -= 100;
        }

    });

HTML

<div ng-app="Demo" ng-controller="DemoController">
    <div>
        <h4>{{service.name}}</h4>
        <p>Count: {{service.count}}</p>
    </div>
</div>

Я спросил OP, нужны ли $watch, чтобы данные были одинаковыми для контроллеров, и они сказали "нет", не уточняя.

Но, когда я проверяю это, значение "count" DemoService на обоих контроллерах не одинаково, если только я не использую $watch.

Вот скрипка с приведенным ниже примером, но с добавленным контроллером:

http://jsfiddle.net/qqejytbz/1/

Учитывая этот пример, как можно сохранить значение одинаковым, но без использования $watch или $broadcast?

Обновлен скрипт благодаря выбранному ответу:

http://jsfiddle.net/qqejytbz/4/

Ответ 1

В вашем втором контроллере вы сохраняете значение count напрямую, что делает копию счета в момент его назначения. Если count были объектом, то {{service.count}} и $scope.count будут просто ссылкой на один и тот же объект. Затем измененные свойства объекта будут синхронизированы между контроллерами.

Eg.

//in DemoService
self.count = {value: 0};
// Binding in html for controller 1
{{service.count.value}}
// Assignment in controller 2:
$scope.count = DemoService.count;
//$scope.count.value === controller1.service.count.value === 0

service.count.value += 100
//$scope.count.value === controller1.service.count.value === 100

Обратите внимание, что Angular может не подхватывать изменения объекта до следующего полного цикла дайджест.