我有一小段代码无法正常工作:
$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);
});
感谢所有人
答案 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
值的更改。初始调用设置意味着存储表达式的初始值。