javascript - 在 Angular 中更改页面时,如何修复 yyyy 不是一个函数?

标签 javascript jquery angularjs angular-ui-router

我有一个 Angular 应用程序,它使用 Videojs 插件在视频上添加标记。一切正常,除了从一个页面转到另一个页面时,我收到错误:player.markers 不是一个函数。仅当我刷新页面时它才会再次工作。

为了更好地解释,当我第一次进入网页时,或者如果页面已经打开并刷新它,那么一切正常。但是,如果我转到第 2 页,我会收到 player.markers is not a function 错误。另外,如果我刷新页面,它会再次工作。

我知道修复起来应该很简单,从一个页面转到另一个页面时插件未加载的地方,但我找不到解决方案。

这是我的代码:

Controller :

// ********  CONTROLLER 1 *********
app.controller('topicCtrl', function($scope, $routeParams, $http) {
    //bookmarks list. here is also data about markers on video progress bar
    $scope.markers = [
    {
        time: 9.5,
        text: "Compare Balance",
        overlayText: 'overlay'
    },
    {
        time: 106,
        text: "xRay Rules",
        overlayText: 'overlay'
    },
    {
        time: 43.6,
        text: "Rule filter0-text",
        overlayText: 'overlay'
    },
    {
        time: 78,
        text: "Using help-id class",
        overlayText: 'overlay'
    }];

    //video player object
    var player = videojs('myVideo');

    //load the marker plugin
    //!!! HERE IS WHERE I GET THE ERROR. player.markers not a function
    player.markers({
        markers: $scope.markers,
        markerStyle: {
            'width': '17px',
            'border-radius': '30%',
            'background-color': 'green'
        },
        markerTip:{
            display: true,
            text: function(marker) {
                return marker.text;
           },
            time: function(marker) {
                return marker.time;
            }
        },
         onMarkerClick: function(marker) {}
    });
});

// ********  CONTROLLER 2 *********
app.controller('devCtrl', function ($scope, $routeParams, $http, $window) {

    //bookmarks list. here is also data about markers on video progress bar
    $scope.markers = [
    {
        time: 9.5,
        text: "Compare Balance",
        overlayText: 'overlay'
    },
    {
        time: 106,
        text: "xRay Rules",
        overlayText: 'overlay'
    },
    {
        time: 43.6,
        text: "Rule filter0-text",
        overlayText: 'overlay'
    },
    {
        time: 78,
        text: "Using help-id class",
        overlayText: 'overlay'
    }];

    //video player object
    var devPlayer = videojs('myVideo');

    //load the marker plugin
    devPlayer.markers({
        markers: [],
        markerStyle: {
            'width': '17px',
            'border-radius': '30%',
            'background-color': 'green'
        },
        markerTip:{
            display: true,
            text: function(marker) {
                return marker.text;
            },
            time: function(marker) {
                return marker.time;
            }
        },
        onMarkerClick: function(marker) {}
    });
})

HTML

<!- ***** page 1 ***** -->
    <div id="page">
        <h2>Page 1 {{title}}</h2>

        <div id="videoContainer">
            <video id = "myVideo" width="600" class="video-js vjs-default-skin" controls>
                <source src="videos/xray-stable-ids.mp4" type="video/mp4" />
            </video>

            <bookmark-list></bookmark-list>
        </div>
    </div>

<!- ***** page 2 ***** -->
    <div id="page">
        <h2>Page 2 {{title}}</h2>

        <div id="videoContainer">
            <video id = "myVideo" width="600" class="video-js vjs-default-skin" controls>
                <source src="videos/xray-stable-ids.mp4" type="video/mp4" />
            </video>

            <bookmark-list></bookmark-list>
        </div>
    </div>

我还尝试观察路线变化,并尝试加载整个页面,但没有成功。

这是我的笨蛋。请注意,当您在页面之间切换时,您得到的player.markers不是一个函数。我需要理解为什么我会在页面更改上看到它。 https://plnkr.co/edit/OfbJEpgZiGdbXwF3kNE0?p=preview

最佳答案

当您第一次调用 videojs('myVideo') 时,它会返回带有名为 markers方法(函数) 的对象。当您调用它时,它会返回带有属性/方法的 object adddestroygetMarkers 等。随后每次调用 videojs('myVideo') 时,它都会返回该对象。而且你不再有方法 markers() 了。

我在 Controller 中使用简单的 if 语句修复了该问题(两者):

if (typeof devPlayer.markers === 'function') {

  devPlayer.markers({

  ...

}

这是我的 plunker .

关于javascript - 在 Angular 中更改页面时,如何修复 yyyy 不是一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41702404/

相关文章:

javascript - 当ykey值为0且xkeys为月份时绘制折线图

javascript - d3 单击时放大 svg,下次双击时缩小

javascript - 如何使用 Ajax 和 HTML 结构来回显自动完成选项?

javascript - <ng-show> 在 Angular Materials 上隐藏时显示为文本

javascript - 在javascript中更改元素及其父元素的位置

javascript - 如何在 JS 脚本中加载多个 CSS 文件

javascript - 如何在一页中使用类添加多个ckeditor?

javascript - 无论用户输入如何,我的输出始终是数组中的第一项

javascript - 如何允许单击每个项目/帖子,然后在新屏幕中查看它?

javascript - 将表单传递给 AngularJS 组件进行验证