ng-show 未在 value=true 上触发
ng-show not triggered on value=true
我正在尝试使用 ng-show
在 Vimeo 视频结束时显示 div,但我可以让它工作。
负责控制器的相关部分ng-show
看起来像
'use strict';
myApp.controller('videoController', [
'$scope',
'$routeParams',
'$rootScope',
'$location',
'$log',
function(
$scope,
$routeParams,
$rootScope,
$location,
$log
)
{
var player = new Vimeo.Player('player');
player.on('timeupdate', function(data) {
$scope.videoFinished = false;
$scope.currentPlayDuration = (data.percent * 100).toFixed(1);
if($scope.currentPlayDuration==100.0){
$scope.videoFinished = true;
$log.debug('Video finished: ' + $scope.videoFinished);
$scope.apply();
}
});
}
]);
以及该部分的视图:
<div class="row" ng-show="videoFinished">Thank you for watching!</div>
相关控制器定义部分:
myApp.config(['$routeProvider','$locationProvider',function($routeProvider,$locationProvider) {
$routeProvider
.when('/video', {
templateUrl: 'video.html',
controller: 'videoController'
})
.otherwise({
redirectTo: '/'
});
当我运行视频到终端控制台时会显示
Video finished: true
但是上面的 div 没有显示。
有线索吗?
视频播放器的事件发生在 AngularJS 的摘要周期之外,因此您必须使用 $scope.$apply()
手动启动摘要周期,以便它可以获取更改:
player.on('timeupdate', function(data) {
$scope.videoFinished = false;
$scope.currentPlayDuration = (data.percent * 100).toFixed(1);
if ($scope.currentPlayDuration == 100.0) {
$scope.videoFinished = true;
$log.debug('Video finished: ' + $scope.videoFinished);
$scope.$apply();
}
});
附带说明一下,让您的控制器直接与页面中的非 Angular 组件交互并不是好的做法。这样做的适当位置通常是在自定义指令中。
我正在尝试使用 ng-show
在 Vimeo 视频结束时显示 div,但我可以让它工作。
负责控制器的相关部分ng-show
看起来像
'use strict';
myApp.controller('videoController', [
'$scope',
'$routeParams',
'$rootScope',
'$location',
'$log',
function(
$scope,
$routeParams,
$rootScope,
$location,
$log
)
{
var player = new Vimeo.Player('player');
player.on('timeupdate', function(data) {
$scope.videoFinished = false;
$scope.currentPlayDuration = (data.percent * 100).toFixed(1);
if($scope.currentPlayDuration==100.0){
$scope.videoFinished = true;
$log.debug('Video finished: ' + $scope.videoFinished);
$scope.apply();
}
});
}
]);
以及该部分的视图:
<div class="row" ng-show="videoFinished">Thank you for watching!</div>
相关控制器定义部分:
myApp.config(['$routeProvider','$locationProvider',function($routeProvider,$locationProvider) {
$routeProvider
.when('/video', {
templateUrl: 'video.html',
controller: 'videoController'
})
.otherwise({
redirectTo: '/'
});
当我运行视频到终端控制台时会显示
Video finished: true
但是上面的 div 没有显示。
有线索吗?
视频播放器的事件发生在 AngularJS 的摘要周期之外,因此您必须使用 $scope.$apply()
手动启动摘要周期,以便它可以获取更改:
player.on('timeupdate', function(data) {
$scope.videoFinished = false;
$scope.currentPlayDuration = (data.percent * 100).toFixed(1);
if ($scope.currentPlayDuration == 100.0) {
$scope.videoFinished = true;
$log.debug('Video finished: ' + $scope.videoFinished);
$scope.$apply();
}
});
附带说明一下,让您的控制器直接与页面中的非 Angular 组件交互并不是好的做法。这样做的适当位置通常是在自定义指令中。