【问题标题】:AngularJS (1.2.25) $rootScope.$broadcast('message',data) not being received by $scope.$on('message')AngularJS (1.2.25) $rootScope.$broadcast('message',data) 没有被 $scope.$on('message') 接收
【发布时间】:2014-10-01 18:51:53
【问题描述】:

我无法获取 $scope 变量来触发屏幕重新绑定。是的,我在分配 $scope.value = value; 后尝试调用 $scope.$apply()是的,我尝试在分配后手动调用 $digest();我收到错误“$rootScope:inprog] $digest already in progress。

所以我所做的是尝试让我的 $rootScope.$on('message'function(){}) 侦听器创建一个辅助 $broadcast 到所有范围以尝试深入了解它;但是,我的 $scope 对事件的注册没有触发,我认为这可能与同一问题有关....也许不是。无论如何,这是我的密码。

我会制作一个小提琴,但它目前被网络政策阻止。

清单:

  • [配置]
  • [index.html]
  • [foo.html]
  • [ctrl]

[config](一些尝试的 hack。它们用 cmets 标记)

    var kata = angular.module('kata',[
        'ngRoute'   
    ]).run(['$rootScope',
    function($rootScope){
        $rootScope.$on('message:foo',function(event,data){
            $rootScope.$broadcast('message:bar',['foo1','foo2','foo3']);//send secondary msg
            $rootScope.data = data; //Hack #1: When I couldn't get $scope to rebind, I tried to use $rootScope;still doesn't rebind.
        });
    }]);

kata.config(['$routeProvider',
    function($routeProvider){
        $routeProvider
            .when('/Foo',{
                templateUrl: 'foo.html',
                controller: 'FooCtrl'
            });
}]);

[index](这里没什么好笑的)

<html ng-app="kata">
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"></meta>
        <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.js"></script>
        <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular-route.js"></script>

        <script src="./routingConfig.js"></script>
        <script src="./controllers.js"></script>        
    </head>
    <body>
        <div class="view-container">
            <div ng-view class="view-frame"></div>
        </div>
    </body>
</html>

[foo.html](这里没什么好笑的) 有几个 $scope 变量附加到相同的东西的几个测试。 这些都没有更新

<div>
    This page is for capturing Data

    Data: {{data}}
    <hr />
    <ul>
        <li ng-repeat="foo in foos">
            <span>Foo Found!</span>
        </li>
    </ul>
</div>

[ctrl](在作用域上创建了几个变量试图以不同的方式解决这个问题)

var kataCtrl= kata.controller("FooCtrl", 
    [        '$scope', '$http','$rootScope','$location'
    ,function($scope,   $http,  $rootScope , $location) {
        $scope.data = "Foo";
        $scope.data1 = "[placeholder]";
        $scope.foos = [];


        //fires, assigns, view does not update
        $scope.$watch(function(){
            return $rootScope.data;
        }, function(){
            $scope.foos = ['data','foo','bar','baz'];<=Assignment succeeds. View does not update
            $scope.$apply();//<=Does nothing apparent; View does not update
            $scope.$digest();//<= Console Error. Already in digest loop
        },true);


        //does not fire
        $scope.$on('message:foo',function(event,data){ //<= This never catches
            $scope.data = data; 
        });


        //fires, assigns, View does not update
        $rootScope.$on('message:bar',function(event,data){
            $scope.foos = ['data','foo','bar','baz'];
            $scope.foo1 = data.element1;
            $scope.data = "[Foos returned from $rootScope]";
            $scope.$apply();//<= Does not help. Changing to $scope.$digest() indicates already in digest loop
        });
}]);

回顾一下,我的配置中的 $rootScope.$on() 正在触发。它正在正确地为 $rootScope 上的变量赋值。 $rootScope.$broadcast 正在生成辅助消息。控制器的 $scope.$on 注册消息没有捕获。控制器的 $rootScope.$on 注册触发并在 $scope 上分配值,但视图不会重新绑定。调用 $scope.$apply() 没有帮助。调用 $scope.$digest() 仅报告摘要循环当前正在运行。

作用域变量被分配,但视图永远不会重新绑定。

在广阔的体育世界里发生了什么?

【问题讨论】:

    标签: javascript angularjs scope


    【解决方案1】:

    我认为问题在于您正在广播 'message:bar' 并在控制器中收听 'message:foo'。我已经制作了您的代码的简化版本。您可以看到我的代码向根范围发出事件,并在子范围内获得广播事件:

    <html ng-app="kata">
        <head>
            <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"></meta>
            <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.js"></script>
            <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular-route.js"></script>
       
        </head>
        <body>
            <div class="view-container" ng-controller="FooCtrl">
                <div class="view-frame">
                <div>
                    This page is for capturing Data
                    <br>
                    Data: {{data}}
                    <hr />
                    <ul>
                        <li ng-repeat="foo in foos">
                            <span>Foo Found!</span>
                        </li>
                    </ul>
                </div>
                </div>
            </div>
            
            <script>
                var kata = angular.module('kata',[
                        'ngRoute'   
                    ]).run(['$rootScope',
                    function($rootScope){
                        $rootScope.$on('message:foo',function(event,data){
                            $rootScope.$broadcast('message:bar',['Data', 'from', 'root', 'scope']);//send secondary msg
                        });
                    }]);
    
    
                kata.controller("FooCtrl", 
                    [        '$scope', '$http','$rootScope','$location'
                    ,function($scope,   $http,  $rootScope , $location) {
                        $scope.data = "Foo";
                        $scope.data1 = "[placeholder]";
                        $scope.foos = [];
    
                        $scope.$on('message:bar',function(event,data){
                            $scope.data = data; 
                        });
                        
                        $scope.$emit('message:foo');
                }]);
            </script>
        </body>
    </html>

    【讨论】:

    • 感谢您的回复。请注意,我的 rootScope 和我的控制器的范围都在注册 $on('message:foo') rootScope 的侦听器然后广播控制器的范围正在侦听的 'message:bar'。我最终提取了消息传递结构并在 $rootScope.$data 上设置了 $rootScope.$watch。然后我必须检查 $scope.$parent 的存在,以防止 $rootScope 通过手表擦除我的作用域值。这样做会导致视图重新绑定。我离开了我的开发机器,但我明天会发布更正的代码,以完整记录我的问题的解决方案。
    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多