$ scope outsite $ on listener return undefined

时间:2017-04-29 17:15:21

标签: angularjs

我有一小段代码无法正常工作:

$scope.$on('play', function(e, data) {
   $scope.tick = (data.time*100)/2.5;
});
console.log($scope.tick);

如果我在$scope.tick之外$on退回undefined。我无法理解为什么,我需要在事件监听器之外访问该变量。

这是触发$on

的代码
angular.module('videoCtrl', ['vjs.video'])
  .controller('videoController', ['$scope', 'Timeline', function ($scope, Timeline) {
        $scope.mediaToggle = {
            sources: [
                {
                    src: 'http://static.videogular.com/assets/videos/videogular.mp4',
                    type: 'video/mp4'
                }
            ],
        };

        //listen for when the vjs-media object changes
        $scope.$on('vjsVideoReady', function (e, videoData) {
          videoData.player.on('timeupdate', function () {
            var time = {
              time: this.currentTime()
            };
            $scope.$broadcast('play', time);
          })
        });
    }]);

在这里接收它的人:

angular.module('mediaTimelineCtrl', ['mt.media-timeline'])
    .controller('DemoMediaTimelineController', function ($scope, Timeline) {
    $scope.tick = 100;
    $scope.disable = false;
    $scope.timelines = Timeline.getTimelines();

    $scope.$on('play', function(e, data) {
      $scope.tick = (data.time*100)/2.5;
    });
    console.log($scope.tick);
});

感谢所有人

3 个答案:

答案 0 :(得分:1)

XAMPP是angularjs提供的一种方法,它允许您监听特定广播,此时将执行所提供的功能。

您在注册设置$on变量的回调后立即记录变量。此时你的回调还没有被调用。为此,您必须在代码中的某处使用tick(根据您拨打$scope.$broadcast('play', data)的情况,您可能必须使用$broadcast而不是$rootScope,因为广播仅发送事件到子范围。(更多信息请参见角度文档here

修改:现在已在聊天中解决此问题。 $ on中提供的回调被正确调用,但此处使用的视频库称为角度$scope周期之外的事件。将$ scope.tick的赋值包装到$digest就可以了。

答案 1 :(得分:1)

$scope.$on用于收听$broadcast$emit触发的事件。直到其中一个事件触发,on函数才会触发,on函数的内容将无法执行。

但由于控制台日志不在on函数之内,因此无论scope.on是否触发,它都会执行。这就是conosole.log显示未定义的原因。

如果你将控制台放在scope.on函数中,那么它只会在事件触发时执行

答案 2 :(得分:1)

$scope.tick的值仅在触发事件时更新。在第一个摘要周期结束时,$scope.tick的值仍未定义。您必须先初始化$scope.tick的值,或使用$watch [$watch(watchExpression, listener, [objectEquality]);]watchExp正在观看的表达方式。它可以是函数或字符串,在每个摘要周期进行评估。 listener首次设置监视时触发的回调,然后每次在摘要周期内检测到watchExp‘s值的更改。初始调用设置意味着存储表达式的初始值。