Angularjs:无法在服务中观察变量并通知控制器:可能的2个根镜

时间:2016-04-20 11:28:04

标签: javascript angularjs

我正在尝试从我的控制器中查看我的服务中的值。但手表并没有被解雇。

这是我的代码

    Service.js

    (function() {
        function myService($rootScope, anotherService) {
            console.log(rootScope)
            this.myList = [];

            this.getListOfValues = function(question,questionType) {
            anotherService.getList(function(data, status) {                 
                        myService.myList = data;
                });                         
            }                           
        }
        app.addService(app.config.modules.MY_MODULE, "myService", myService);
    }());


    Controller.js

    (function() {
        function myCtrl($scope, $rootScope) {
            console.log(rootScope)
            this.askQuestion = function() {
                myService.getListOfValues();
            }
            $scope.myService = myService;
            $scope.myList = myService.myList;

            $scope.$watch('myService.myList', function (newVal, oldVal) {
                if(newVal && newVal.length > 0) { 
                    $scope.listToLoad = newVal;
                }
            });
            app.addController(app.config.modules.MY_MODULE, "myCtrl", myCtrl);
    }());


    home.html

    <html ng-app = "myApp">
        <head>
            <script>
                app.inject(app.config.modules.MY_MODULE, "myService", function(instance) {
                    myService = instance;
                    console.log("myService dependency injected successfully.");
                });
            </script>
        </head>
        <body ng-controller="myCtrl">
            <div>
                <img id="getList" onclick="askQuestion()">
            </div>
        </body>
    </html>

如果myList变量在我的服务中发生变化,我希望将更改通知给控制器,控制器应该采取一些措施。但手表没有射击。我尝试使用$ rootScope.emit()在myList的更改中触发事件,然后使用$ rootScope.on()在我的控制器中捕获该事件,但即使这样也不起作用。

当我在服务中记录rootScope的值时,我看到rootScope的id为1.请参阅屏幕截图click here

当我在控制器中记录rootScope的值时,我看到rootScope的id为2.请参阅屏幕截图。 click here

如果我检查最高级别的范围,即html ng-app =“myApp”级别,我看到范围的id为2,与控制器相同。

我不明白为什么我的控制器和服务有2个不同的rootScope id。这是我的事件或手表没被解雇的原因吗?

有人可以对此有所了解吗?感谢

1 个答案:

答案 0 :(得分:1)

Angular服务是单个注入器(app实例)中的单例。 app.inject创建一个新的注入器,它有自己的一组服务单例。