【问题标题】:AngularJS Event not firing from $rootScopeAngularJS 事件未从 $rootScope 触发
【发布时间】:2012-11-15 12:06:12
【问题描述】:

我遇到了 $rootScope.$broadcast 事件没有被触发的问题:

App.run(function($rootScope){
    var text = 'Not So Static Now';
    $rootScope.$broadcast('event:staticText', text);
}).$inject = ['$rootScope'];


App.controller('Ctrl1', function($scope, $rootScope) {
   $scope.staticText = "Static Text";

    var things = [
        'AngularJS',
        'StackOverflow',
        'JSFiddle'
    ];

    $scope.$emit('event:things', things);

    $scope.$on('event:staticText', function(e, args){
        $scope.staticText = args;
    });

}).$inject = ['$scope', '$rootScope'];

以上内容应该将 {{staticText}} 输出更改为“Not so Static Now”,但事实并非如此。

我创建了一个 JSFiddle 来演示问题http://jsfiddle.net/flavrjosh/uXzTV/

这是我正在尝试调试的一个更大问题的一部分,其中 IE9 在页面刷新后没有触发事件(第一次工作,但在刷新时 - F5 或刷新按钮没有任何反应)。

任何帮助/建议将不胜感激

【问题讨论】:

  • 只是想知道你为什么要这样做?
  • 基本上 App.run() 将包含检查用户是否登录的逻辑。它在服务承诺对象返回用户信息以验证登录后触发一个事件。其他控制器可以监听登录验证事件并对其采取行动。
  • 为什么你没有一个服务来检查这个并在你想要的每个控制器中调用这个服务?无论如何,这两种方式都需要在控制器中添加一些代码。
  • 这是一个简单的例子。完整版使用带有 defer 模块的服务来提供一个 Promise 对象,该对象在成功响应时触发事件。这有同样的结果。我最终只使用了 $scope.$watch() 来处理 promise 回调更改值的时间。
  • 是的,听起来更好。因为我觉得你使用 run 的方式有点不像它的设计方式。

标签: javascript angularjs


【解决方案1】:

问题似乎是由于在触发 $rootScope.$broadcast 事件时未设置子作用域造成的。

我解决了这个例子:

App.run(function($rootScope, $timeout){
    var text = 'Not So Static Now';

    $timeout(function(){
        $rootScope.$broadcast('event:staticText', text);
    }, 100);
}).$inject = ['$rootScope'];

和:

App.controller('Ctrl1', function($scope, $rootScope) {
    $scope.staticText = "Static Text";

    var things = [
        'AngularJS',
        'StackOverflow',
        'JSFiddle'
    ];

    $scope.$emit('event:things', things);

    $scope.$on('event:staticText', function(e, args){
        $scope.$apply(function(){
            $scope.staticText = args;
        });
    });

}).$inject = ['$scope', '$rootScope'];

可以看到here

不确定这是否是最好的解决方案,但它确实有效。

【讨论】:

  • 您应该使用$timeout 提供程序,因为它实际上会等到下一个摘要周期再运行回调函数。您甚至不需要设置毫秒。
  • $timeout 提供者添加到广播中为我做的!
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 2013-11-14
  • 2013-04-15
  • 2017-07-21
相关资源
最近更新 更多